diff --git a/lib/bash/std/lib_std.sh b/lib/bash/std/lib_std.sh index 15b0fc6..d71af4d 100644 --- a/lib/bash/std/lib_std.sh +++ b/lib/bash/std/lib_std.sh @@ -3618,9 +3618,14 @@ __base_bash_libs_std_validate_array_kind__() { (($# >= 3)) || return 1 local __base_bash_libs_std_validate_array_operation="$1" __base_bash_libs_std_validate_array_kind="$2" local __base_bash_libs_std_validate_array_name __base_bash_libs_std_validate_array_label=indexed + local -i __base_bash_libs_std_validate_array_kind_code=0 shift 2 - [[ "$__base_bash_libs_std_validate_array_kind" == "A" ]] && + # Compare the marker byte numerically so caller `nocasematch` cannot make + # Bash classify the indexed marker `a` as the associative marker `A`. + printf -v __base_bash_libs_std_validate_array_kind_code '%d' \ + "'$__base_bash_libs_std_validate_array_kind" + ((__base_bash_libs_std_validate_array_kind_code == 65)) && __base_bash_libs_std_validate_array_label=associative __base_bash_libs_std_validate_variable_names__ \ "$__base_bash_libs_std_validate_array_operation" "$@" || return 1 diff --git a/lib/bash/std/tests/lib_std.bats b/lib/bash/std/tests/lib_std.bats index 518c6e9..b3da033 100644 --- a/lib/bash/std/tests/lib_std.bats +++ b/lib/bash/std/tests/lib_std.bats @@ -4575,6 +4575,23 @@ EOF shopt -q nocasematch } +@test "array-kind validation keeps indexed diagnostics case-sensitive with nocasematch" { + local -A associative_values=([alpha]=one) + local stderr_file="$TEST_TMPDIR/array-kind-validation.err" + local status + + shopt -s nocasematch + if __base_bash_libs_std_validate_array_kind__ base_std_test a associative_values 2>"$stderr_file"; then + status=0 + else + status=$? + fi + shopt -u nocasematch + + [ "$status" -eq 1 ] + [[ "$(cat "$stderr_file")" == *"must be a caller-declared indexed array."* ]] +} + @test "base_std_assert_associative_array accepts declared associative arrays" { local -A values=([alpha]="one") diff --git a/lib/bash/str/tests/lib_str.bats b/lib/bash/str/tests/lib_str.bats index d7cb99e..0f7297b 100644 --- a/lib/bash/str/tests/lib_str.bats +++ b/lib/bash/str/tests/lib_str.bats @@ -195,7 +195,7 @@ create_script() { [ "$rc" -eq 2 ] [ "${fields[keep]}" = sentinel ] - [[ "$(<"$stderr_file")" == *"attributes incompatible with the indexed-array output contract"* ]] + [[ "$(<"$stderr_file")" == *"must be a caller-declared indexed array"* ]] } @test "readonly string outputs cannot collide with argument-count decimal locals" {