diff --git a/src/env.cpp b/src/env.cpp index dbb85ed66..2d25cb5de 100644 --- a/src/env.cpp +++ b/src/env.cpp @@ -1184,6 +1184,7 @@ static int env_set_internal(const wcstring &key, env_mode_flags_t input_var_mode var.set_vals(std::move(val)); var.set_pathvar(var_mode & ENV_PATHVAR); + var.set_read_only(is_read_only(key)); if (var_mode & ENV_EXPORT) { // The new variable is exported. diff --git a/src/env.h b/src/env.h index 30fb4ab0d..f055eb623 100644 --- a/src/env.h +++ b/src/env.h @@ -122,6 +122,14 @@ class env_var_t { } } + void set_read_only(bool read_only) { + if (read_only) { + flags |= flag_read_only; + } else { + flags &= ~flag_read_only; + } + } + static env_var_flags_t flags_for(const wchar_t *name); env_var_t &operator=(const env_var_t &var) = default; diff --git a/tests/test1.err b/tests/test1.err index 5e9cda705..e5a978376 100644 --- a/tests/test1.err +++ b/tests/test1.err @@ -38,6 +38,12 @@ fish: You cannot use read-only variable 'status' in a for loop for status in a b c ^ +#################### +# That goes for non-electric ones as well (#5548) +fish: You cannot use read-only variable 'hostname' in a for loop +for hostname in a b c + ^ + #################### # For loop control vars available outside the for block diff --git a/tests/test1.in b/tests/test1.in index 104f984ea..7f0f1dcaa 100644 --- a/tests/test1.in +++ b/tests/test1.in @@ -163,6 +163,11 @@ for status in a b c echo $status end +logmsg "That goes for non-electric ones as well (#5548)" +for hostname in a b c + echo $hostname +end + logmsg For loop control vars available outside the for block begin set -l loop_var initial-value diff --git a/tests/test1.out b/tests/test1.out index 56fd4f64d..b3b075fab 100644 --- a/tests/test1.out +++ b/tests/test1.out @@ -96,6 +96,9 @@ Checking for infinite loops in no-execute #################### # For loops with read-only vars is an error (#4342) +#################### +# That goes for non-electric ones as well (#5548) + #################### # For loop control vars available outside the for block $loop_var: set in local scope, unexported, with 1 elements