ninja: no work to do.

///
/// Runtime errors - Unquoted test functions
///


===== TEST function: unquoted-ambiguous_redirect =====

    echo foo > "$@"
               ^
test/runtime-errors.sh:534: Can't redirect to zero files
ambiguous redirect not fatal unless errexit
    echo foo > "$@"
               ^
test/runtime-errors.sh:538: Can't redirect to zero files
----- STATUS: 0


===== TEST function: unquoted-ambiguous_redirect_context =====

    echo $(echo hi > "$@")
                     ^
test/runtime-errors.sh:551: Can't redirect to zero files

ambiguous is NOT FATAL in command sub

    foo=$(echo hi > "$@")
                    ^
test/runtime-errors.sh:555: Can't redirect to zero files

ambiguous is NOT FATAL in assignment in command sub

    echo $(echo hi > "$@")
                     ^
test/runtime-errors.sh:563: Can't redirect to zero files

ambiguous is NOT FATAL in command sub, even if errexit

But when the command sub is in an assignment, it is fatal
    foo=$(echo hi > "$@")
                    ^
test/runtime-errors.sh:570: Can't redirect to zero files
----- STATUS: 0


===== TEST function: unquoted-array_arith =====

2 2
----- STATUS: 0


===== TEST function: unquoted-array_assign_1 =====

    s[0]=x  # can't assign value
    ^~
test/runtime-errors.sh:846: fatal: Can't assign to items in a string
----- STATUS: 0


===== TEST function: unquoted-array_assign_2 =====


===== CASE: -c readonly -a array=(1 2 3); array[0]=x =====


  readonly -a array=(1 2 3); array[0]=x
                             ^~~~~~
[ -c flag ]:1: fatal: Can't assign to readonly array

===== CASE: -c readonly -a array=(1 2 3); export array =====



Should FAIL under _bin/cxx-asan/osh: expected status 1, got 0
----- STATUS: 0


===== TEST function: unquoted-bad_file_descriptor =====

F_GETFD fd 7: Bad file descriptor
test/runtime-errors.sh:576: I/O error applying redirect: Bad file descriptor
----- STATUS: 0


===== TEST function: unquoted-bad_var_ref =====

  bad var name
     ^
[ contents of var 'name' at line 637 of test/runtime-errors.sh ]:1: Expected end of var ref expression
    echo ${!name}
            ^~~~
test/runtime-errors.sh:637: fatal: Invalid var ref expression
----- STATUS: 0


===== TEST function: unquoted-bool_status =====

    if try --allow-status-01 -- myproc; then
           ^~~~~~~~~~~~~~~~~
test/runtime-errors.sh:607: 'try' got invalid flag '--allow-status-01'
no match
----- STATUS: 0


===== TEST function: unquoted-bool_status_simple =====

    if try --allow-status-01 -- grep pat BAD; then
           ^~~~~~~~~~~~~~~~~
test/runtime-errors.sh:617: 'try' got invalid flag '--allow-status-01'
no match
----- STATUS: 0


===== TEST function: unquoted-builtin_alias_unalias =====

    alias zzz
    ^~~~~
test/runtime-errors.sh:957: No alias named 'zzz'
    unalias zzz
    ^~~~~~~
test/runtime-errors.sh:958: No alias named 'zzz'
----- STATUS: 0


===== TEST function: unquoted-builtin_bracket =====

    [ -t xxx ]
         ^~~
test/runtime-errors.sh:890: (test) Invalid file descriptor 'xxx'
    [ -t '' ]
         ^
test/runtime-errors.sh:891: (test) Invalid file descriptor ''
    [ zz -eq 0 ]
      ^~
test/runtime-errors.sh:893: (test) Invalid integer constant 'zz'
----- STATUS: 0


===== TEST function: unquoted-builtin_builtin =====

    builtin ls
            ^~
test/runtime-errors.sh:901: 'ls' isn't a shell builtin
----- STATUS: 0


===== TEST function: unquoted-builtin_cd =====

      cd
      ^~
test/runtime-errors.sh:913: $HOME isn't defined
      cd
      ^~
test/runtime-errors.sh:919: $HOME should be a string
      cd -
      ^~
test/runtime-errors.sh:924: $OLDPWD isn't defined
    ( cd /nonexistent
         ^
test/runtime-errors.sh:927: cd '/nonexistent': No such file or directory
----- STATUS: 0


===== TEST function: unquoted-builtin_exec =====

    exec nonexistent-command 1 2 3
         ^~~~~~~~~~~~~~~~~~~
test/runtime-errors.sh:1020: fatal: exec: 'nonexistent-command' not found
----- STATUS: 0


===== TEST function: unquoted-builtin_getopts =====

    getopts
    ^~~~~~~
test/runtime-errors.sh:973: 'getopts' requires an argspec
    getopts 'a:'
    ^~~~~~~
test/runtime-errors.sh:974: 'getopts' requires the name of a variable to set
    getopts 'a:' varname
    ^~~~~~~
test/runtime-errors.sh:978: getopts: option '-a' requires an argument.
(getopts argv: -a)
----- STATUS: 0


===== TEST function: unquoted-builtin_help =====

    help zzz
         ^~~
test/runtime-errors.sh:962: no help topics match 'zzz'
----- STATUS: 0


===== TEST function: unquoted-builtin_popd =====

    popd  # empty dir stack
    ^~~~
test/runtime-errors.sh:936: popd: directory stack is empty
~/oil/_tmp/runtime-error-popd ~/oil
/ ~/oil/_tmp/runtime-error-popd ~/oil
      popd
      ^~~~
test/runtime-errors.sh:944: popd: '/home/uke/oil/_tmp/runtime-error-popd': No such file or directory
----- STATUS: 0


===== TEST function: unquoted-builtin_pushd =====

    pushd /nonexistent
          ^
test/runtime-errors.sh:932: pushd: '/nonexistent': No such file or directory
----- STATUS: 0


===== TEST function: unquoted-builtin_source =====

    source
    ^~~~~~
test/runtime-errors.sh:905: 'source' missing required argument
    source $bad
           ^~~~
test/runtime-errors.sh:908: source '/nonexistent/path' failed: No such file or directory
----- STATUS: 0


===== TEST function: unquoted-builtin_trap =====

    trap
    ^~~~
test/runtime-errors.sh:966: 'trap' requires a code string
    trap EXIT
    ^~~~
test/runtime-errors.sh:967: 'trap' requires a signal or hook name
    trap zzz yyy
             ^~~
test/runtime-errors.sh:969: Invalid signal or hook 'yyy'
----- STATUS: 0


===== TEST function: unquoted-builtin_unset =====

    unset x a
            ^
test/runtime-errors.sh:952: Can't unset readonly variable 'a'
    unset -v x a
               ^
test/runtime-errors.sh:953: Can't unset readonly variable 'a'
----- STATUS: 0


===== TEST function: unquoted-builtin_wait =====

    wait 1234578
         ^~~~~~~
test/runtime-errors.sh:1016: 1234578 isn't a child of this shell
----- STATUS: 0


===== TEST function: unquoted-command_sub_errexit =====

----- STATUS: 0


===== TEST function: unquoted-multiple_assign =====

    a=1 b=2 x=42
            ^~
test/runtime-errors.sh:867: fatal: Can't assign to readonly value 'x'
----- STATUS: 0


===== TEST function: unquoted-multiple_assign_2 =====

0
----- STATUS: 0


===== TEST function: unquoted-no_such_command_heredoc =====

  $(ZZZZZ)
    ^~~~~
test/runtime-errors.sh:101: 'ZZZZZ' not found (OILS-ERR-100)
one

three
SHOULD NOT GET HERE
----- STATUS: 0


===== TEST function: unquoted-nounset =====

    echo $x
         ^~
test/runtime-errors.sh:630: fatal: Undefined variable 'x'
----- STATUS: 0


===== TEST function: unquoted-nounset_arith =====

    echo $(( x ))
             ^
test/runtime-errors.sh:646: fatal: Undefined variable 'x'
----- STATUS: 0


===== TEST function: unquoted-patsub_bad_glob =====

    echo ${x//[^]}
            ^
test/runtime-errors.sh:796: fatal: Error matching regex '([^])': Invalid regex syntax (func_regex_first_group_match)
----- STATUS: 0


===== TEST function: unquoted-pipefail =====

0
0
----- STATUS: 0


===== TEST function: unquoted-pipefail_func =====

      1       1       3
----- STATUS: 0


===== TEST function: unquoted-pipefail_group =====

      1       1       3
----- STATUS: 0


===== TEST function: unquoted-pipefail_multiple =====

six
----- STATUS: 0


===== TEST function: unquoted-pipefail_no_words =====

    seq 3 | wc -l | > /nonexistent
                    ^
test/runtime-errors.sh:435: Can't open '/nonexistent': Permission denied
test/runtime-errors.sh:435: I/O error applying redirect: Permission denied
----- STATUS: 0


===== TEST function: unquoted-pipefail_subshell =====

      1       1       3
----- STATUS: 0


===== TEST function: unquoted-pipefail_while =====

      2       6      12
----- STATUS: 0


===== TEST function: unquoted-process_sub_fail =====

a
b
----- STATUS: 0


===== TEST function: unquoted-readonly_assign =====


===== CASE: -c readonly x=1; x=2 =====


  readonly x=1; x=2
                ^~
[ -c flag ]:1: fatal: Can't assign to readonly value 'x'

===== CASE: -c readonly x=2; y=3 x=99 =====


  readonly x=2; y=3 x=99
                    ^~
[ -c flag ]:1: fatal: Can't assign to readonly value 'x'

===== CASE: -c readonly x=2; declare x=99 =====


  readonly x=2; declare x=99
                        ^~
[ -c flag ]:1: fatal: Can't assign to readonly value 'x'

===== CASE: -c readonly x=2; export x=99 =====


  readonly x=2; export x=99
                       ^~
[ -c flag ]:1: fatal: Can't assign to readonly value 'x'
----- STATUS: 0


===== TEST function: unquoted-strict_arith_warnings =====

1
  -yy-
      ^
[ var ? at line 1056 of test/runtime-errors.sh ]:1: Unexpected end of input
  -yy-
      ^
[ var ? at line 1056 of test/runtime-errors.sh ]:1: fatal: Parse error in recursive arithmetic
----- STATUS: 0


===== TEST function: unquoted-strict_array =====

    echo foo > _tmp/"$@"
               ^~~~
test/runtime-errors.sh:816: Can't redirect to more than one file
    echo foo > _tmp/"$@"
               ^~~~
test/runtime-errors.sh:818: Can't redirect to more than one file
----- STATUS: 0


===== TEST function: unquoted-strict_array_2 =====

    local foo="$@"
              ^
test/runtime-errors.sh:824: fatal: This word should yield a string, but it contains an array
----- STATUS: 0


===== TEST function: unquoted-strict_array_3 =====

    local foo=${1:- "[$@]" }
              ^~
test/runtime-errors.sh:830: fatal: This word should yield a string, but it contains an array
----- STATUS: 0


===== TEST function: unquoted-strict_array_4 =====

x[42] = 99
----- STATUS: 0


===== TEST function: unquoted-strict_word_eval_warnings =====

slice start negative
-bc-
slice length negative
--
slice bad utf-8
[??? no location ???] warning: Invalid start of UTF-8 character
--
length bad utf-8
    echo ${#s}
            ^
test/runtime-errors.sh:1047: warning: Invalid start of UTF-8 character
-1
----- STATUS: 0


===== TEST function: unquoted-string_as_array =====

foo
foo
----- STATUS: 0


===== TEST function: unquoted-string_to_hex =====

1
SHOULD NOT GET HERE
----- STATUS: 0


===== TEST function: unquoted-string_to_int_arith =====

5
  ZZZ
  ^~~
[ var ? at line 688 of test/runtime-errors.sh ]:1: fatal: Undefined value in arithmetic context
----- STATUS: 0


===== TEST function: unquoted-string_to_int_bool =====

  a
  ^
[ var ? at line 810 of test/runtime-errors.sh ]:1: fatal: Undefined value in arithmetic context
----- STATUS: 0


===== TEST function: unquoted-string_to_intbase =====

0
SHOULD NOT GET HERE
----- STATUS: 0


===== TEST function: unquoted-string_to_octal =====

1
SHOULD NOT GET HERE
----- STATUS: 0


===== TEST function: unquoted-undef-assoc-array =====

bar
['bar', '11']
['bar', '16']
----- STATUS: 0


===== TEST function: unquoted-undef_arith =====

    (( undef[42]++ ))
    ^~
test/runtime-errors.sh:718: fatal: Can't use [] on value of type Str
----- STATUS: 0


===== TEST function: unquoted-undef_arith2 =====

['2']
----- STATUS: 0


test/runtime-errors.sh: 53 unquoted functions run.  TODO: migrate to test-* to assert status

///
/// Runtime errors - test functions
///

*** Running test-FAIL

===== CASE: -c echo hi > /zzz =====


  echo hi > /zzz
          ^
[ -c flag ]:1: Can't open '/zzz': Permission denied
[ -c flag ]:1: I/O error applying redirect: Permission denied
OK  test-FAIL
*** Running test-arith_ops_str

===== CASE: -c = "100" + "10a" =====


  = "100" + "10a"
          ^
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c = "100" - "10a" =====


  = "100" - "10a"
          ^
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c = "100" * "10a" =====


  = "100" * "10a"
          ^
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c = "100" / "10a" =====


  = "100" / "10a"
          ^
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c var a = "100"; setvar a += "10a" =====


  var a = "100"; setvar a += "10a"
                          ^~
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c var a = "100"; setvar a -= "10a" =====


  var a = "100"; setvar a -= "10a"
                          ^~
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c var a = "100"; setvar a *= "10a" =====


  var a = "100"; setvar a *= "10a"
                          ^~
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c var a = "100"; setvar a /= "10a" =====


  var a = "100"; setvar a /= "10a"
                          ^~
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c = "age: " + "100" =====


  = "age: " + "100"
            ^
[ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Str (OILS-ERR-201)

===== CASE: -c var myvar = "a string"
= 100 + myvar =====


  = 100 + myvar
        ^
[ -c flag ]:2: fatal: Binary operator expected numbers, got Int and Str (OILS-ERR-201)
OK  test-arith_ops_str
*** Running test-assoc-array

===== CASE: -c declare -A assoc; assoc[x]=1 =====


  declare -A assoc; assoc[x]=1
                    ^~~~~~
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)

===== CASE: -c declare -A assoc; assoc[$key]=1 =====



===== CASE: -c declare -A assoc; assoc["x"]=1 =====



===== CASE: -c declare -A assoc; assoc['x']=1 =====



===== CASE: -c declare -A assoc; echo ${assoc[x]} =====


  declare -A assoc; echo ${assoc[x]}
                                 ^
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)

===== CASE: -c declare -A assoc; echo ${assoc["x"]} =====




===== CASE: -c declare -A assoc; echo ${assoc[$key]} =====




===== CASE: -c declare -A assoc; key=k; unset assoc[$key] =====


  assoc[k]
       ^
[ dynamic LHS word at line 1 of [ -c flag ] ]:1

  declare -A assoc; key=k; unset assoc[$key]
                                 ^~~~~~
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)

===== CASE: -c declare -A assoc; key=k; unset "assoc[$key]" =====


  assoc[k]
       ^
[ dynamic LHS word at line 1 of [ -c flag ] ]:1

  declare -A assoc; key=k; unset "assoc[$key]"
                                 ^
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)

===== CASE: -c declare -A assoc; key=k; unset "assoc[$key]" =====


  assoc[k]
       ^
[ dynamic LHS word at line 1 of [ -c flag ] ]:1

  declare -A assoc; key=k; unset "assoc[$key]"
                                 ^
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)

===== CASE: -c declare -A assoc; key=k; unset 'assoc[$key]' =====



===== CASE: -c eval 'declare -A assoc; assoc[x]=1' =====


  declare -A assoc; assoc[x]=1
                    ^~~~~~
[ eval word at line 1 of [ -c flag ] ]:1

  eval 'declare -A assoc; assoc[x]=1'
  ^~~~
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)

===== CASE: -c eval 'declare -A assoc; unset "assoc[x]"' =====


  assoc[x]
       ^
[ dynamic LHS word at line 1 of [ eval word at line 1 of [ -c flag ] ] ]:1

  declare -A assoc; unset "assoc[x]"
                          ^
[ eval word at line 1 of [ -c flag ] ]:1

  eval 'declare -A assoc; unset "assoc[x]"'
  ^~~~
[ -c flag ]:1: fatal: Assoc array keys must be strings: $x 'x' "$x" etc. (OILS-ERR-101)
OK  test-assoc-array
*** Running test-command-not-found

===== CASE: -c findz =====


  findz
  ^~~~~
[ -c flag ]:1: 'findz' not found (OILS-ERR-100)
OK  test-command-not-found
*** Running test-control_flow

===== CASE: -c 
break
continue
echo UNREACHABLE
 =====


  break
  ^~~~~
[ -c flag ]:2: warning: Invalid control flow at top level
  continue
  ^~~~~~~~
[ -c flag ]:3: warning: Invalid control flow at top level
UNREACHABLE

===== CASE: -c 
shopt -s strict_control_flow
break
continue
echo UNREACHABLE
 =====


  break
  ^~~~~
[ -c flag ]:3: fatal: Invalid control flow at top level
OK  test-control_flow
*** Running test-control_flow_subshell

===== CASE: -c 
  set -o errexit
  for i in $(seq 2); do
    echo $i
    ( break; echo oops)
  done
   =====


1
      ( break; echo oops)
        ^~~~~
[ -c flag ]:5: Loop and control flow can't be in different processes
OK  test-control_flow_subshell
*** Running test-core-state

===== CASE: -c HOME=(a b) =====



===== CASE: -c shopt --set strict_array; HOME=(a b) =====


  shopt --set strict_array; HOME=(a b)
                            ^~~~~
[ -c flag ]:1: fatal: Only strings can be exported (strict_array)
OK  test-core-state
*** Running test-core_process

===== CASE: -c 
  echo foo > not/a/file
  echo foo > /etc/no-perms-for-this
   =====


    echo foo > not/a/file
             ^
[ -c flag ]:2: Can't open 'not/a/file': No such file or directory
[ -c flag ]:2: I/O error applying redirect: No such file or directory
    echo foo > /etc/no-perms-for-this
             ^
[ -c flag ]:3: Can't open '/etc/no-perms-for-this': Permission denied
[ -c flag ]:3: I/O error applying redirect: Permission denied
OK  test-core_process
*** Running test-divzero

===== CASE: -c echo $(( 1 / 0 )) =====


  echo $(( 1 / 0 ))
             ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c echo $(( 1 / (3 -3 ) )) =====


  echo $(( 1 / (3 -3 ) ))
             ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c echo $(( 1 % 0 )) =====


  echo $(( 1 % 0 ))
             ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c zero=0; echo $(( 1 / zero )) =====


  zero=0; echo $(( 1 / zero ))
                     ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c zero=0; echo $(( 1 % zero )) =====


  zero=0; echo $(( 1 % zero ))
                     ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c (( a = 1 / 0 )); echo non-fatal; exit 1 =====


  (( a = 1 / 0 )); echo non-fatal; exit 1
           ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c (( a = 1 % 0 )); echo non-fatal; exit 1 =====


  (( a = 1 % 0 )); echo non-fatal; exit 1
           ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c set -e; (( a = 1 / 0 )); =====


  set -e; (( a = 1 / 0 ));
                   ^
[ -c flag ]:1: fatal: Divide by zero

===== CASE: -c set -e; (( a = 1 % 0 )); =====


  set -e; (( a = 1 % 0 ));
                   ^
[ -c flag ]:1: fatal: Divide by zero
OK  test-divzero
*** Running test-errexit-multiple-processes

===== CASE: -c echo t=$(true) f=$(false; true) =====


  echo t=$(true) f=$(false; true)
                     ^~~~~
[ -c flag ]:1: errexit PID 10310: command.Simple failed with status 1
[ -c flag ]:1: errexit PID 10306: Command Sub exited with status 1

---------------------------

===== CASE: -c ls | false | wc -l =====


  ls | false | wc -l
       ^~~~~
[ -c flag ]:1: errexit PID 10315: command.Simple failed with status 1
0

---------------------------

===== CASE: -c ls | { echo hi; ( exit 42 ); } | wc -l; echo =====


  ls | { echo hi; ( exit 42 ); } | wc -l; echo
                  ^
[ -c flag ]:1: errexit PID 10320: command.Subshell failed with status 42
1
  ls | { echo hi; ( exit 42 ); } | wc -l; echo
       ^
[ -c flag ]:1: errexit PID 10316: command.Pipeline failed with status 42

---------------------------

===== CASE: -c { echo one; ( exit 42 ); } |\
{ false; wc -l; } =====


  { false; wc -l; }
    ^~~~~
[ -c flag ]:2: errexit PID 10323: command.Simple failed with status 1
  { echo one; ( exit 42 ); } |\
              ^
[ -c flag ]:1: errexit PID 10326: command.Subshell failed with status 42
  { false; wc -l; }
  ^
[ -c flag ]:2: errexit PID 10323: command.Pipeline failed with status 1

---------------------------

===== CASE: -c { ls; false; } \
| wc -l
 =====


  { ls; false; } \
        ^~~~~
[ -c flag ]:1: errexit PID 10331: command.Simple failed with status 1
72
  { ls; false; } \
  ^
[ -c flag ]:1: errexit PID 10328: command.Pipeline failed with status 1

---------------------------

===== CASE: -c { ls; ( false; true ); } | wc -l; echo hi =====


  { ls; ( false; true ); } | wc -l; echo hi
          ^~~~~
[ -c flag ]:1: errexit PID 10340: command.Simple failed with status 1
  { ls; ( false; true ); } | wc -l; echo hi
        ^
[ -c flag ]:1: errexit PID 10337: command.Subshell failed with status 1
72
  { ls; ( false; true ); } | wc -l; echo hi
  ^
[ -c flag ]:1: errexit PID 10334: command.Pipeline failed with status 1

---------------------------

===== CASE: -c ls <(sort YY) <(zz); echo hi =====


sort: cannot read: YY: No such file or directory
/dev/fd/4
/dev/fd/5
  ls <(sort YY) <(zz); echo hi
                  ^~
[ -c flag ]:1: 'zz' not found (OILS-ERR-100)
[ -c flag ]:1: errexit PID 10345: command.Simple failed with status 127
  ls <(sort YY) <(zz); echo hi
                ^~
[ -c flag ]:1: errexit PID 10341: command.Simple failed with status 127

---------------------------

===== CASE: -c zz <(sort YY) <(sort ZZ); echo hi =====


  zz <(sort YY) <(sort ZZ); echo hi
  ^~
[ -c flag ]:1: 'zz' not found (OILS-ERR-100)
sort: cannot read: YY: No such file or directory
sort: cannot read: ZZ: No such file or directory
[ -c flag ]:1: errexit PID 10347: command.Simple failed with status 127

---------------------------

===== CASE: -c yy | zz =====


  yy | zz
       ^~
[ -c flag ]:1: 'zz' not found (OILS-ERR-100)
  yy | zz
  ^~
[ -c flag ]:1: 'yy' not found (OILS-ERR-100)
[ -c flag ]:1: errexit PID 10352: command.Simple failed with status 127
[ -c flag ]:1: errexit PID 10355: command.Simple failed with status 127
  yy | zz
       ^~
[ -c flag ]:1: errexit PID 10352: command.Pipeline failed with status 127

---------------------------

===== CASE: -c shopt -s ysh:upgrade; echo $([[ 0 -eq 1 ]]) =====


  shopt -s ysh:upgrade; echo $([[ 0 -eq 1 ]])
                               ^~
[ -c flag ]:1: errexit PID 10357: command.DBracket failed with status 1
[ -c flag ]:1: errexit PID 10356: Command Sub exited with status 1

---------------------------

===== CASE: -c shopt -s ysh:upgrade; var y = $([[ 0 -eq 1 ]]) =====


  shopt -s ysh:upgrade; var y = $([[ 0 -eq 1 ]])
                                  ^~
[ -c flag ]:1: errexit PID 10360: command.DBracket failed with status 1
[ -c flag ]:1: errexit PID 10359: Command Sub exited with status 1
OK  test-errexit-multiple-processes
*** Running test-errexit-one-process

===== CASE: -c zz =====


  zz
  ^~
[ -c flag ]:1: 'zz' not found (OILS-ERR-100)
[ -c flag ]:1: errexit PID 10364: command.Simple failed with status 127

---------------------------

===== CASE: -c echo hi > "" =====


  echo hi > ""
          ^
[ -c flag ]:1: Can't open '': No such file or directory
[ -c flag ]:1: I/O error applying redirect: No such file or directory
[ -c flag ]:1: errexit PID 10367: command.Simple failed with status 1

---------------------------

===== CASE: -c shopt -s failglob; echo *.ZZZZ =====


  shopt -s failglob; echo *.ZZZZ
                          ^
[ -c flag ]:1: failglob: Pattern '*.ZZZZ' matched no files
[ -c flag ]:1: errexit PID 10370: command.Simple failed with status 1

---------------------------

===== CASE: -c cd /x =====


  cd /x
     ^
[ -c flag ]:1: cd '/x': No such file or directory
  cd /x
  ^~
[ -c flag ]:1: errexit PID 10373: command.Simple failed with status 1

---------------------------

===== CASE: -c ./README.md; echo hi =====


  ./README.md; echo hi
  ^
[ -c flag ]:1: Can't execute './README.md': Permission denied
  ./README.md; echo hi
  ^
[ -c flag ]:1: errexit PID 10376: command.Simple failed with status 126

===== CASE: -c ls /x; echo $? =====


ls: cannot access '/x': No such file or directory
  ls /x; echo $?
  ^~
[ -c flag ]:1: errexit PID 10380: command.Simple failed with status 2

---------------------------

===== CASE: -c declare cmd=ls; $cmd /x; echo $? =====


ls: cannot access '/x': No such file or directory
  declare cmd=ls; $cmd /x; echo $?
                  ^~~~
[ -c flag ]:1: errexit PID 10384: command.Simple failed with status 2

---------------------------

===== CASE: -c echo $undef =====


  echo $undef
       ^~~~~~
[ -c flag ]:1: fatal: Undefined variable 'undef'

---------------------------

===== CASE: -c 
eval "("
echo status=$?

eval ")"
echo status=$?

set -e; shopt -s verbose_errexit
false
echo DONE
 =====


  (
   ^
[ eval word at line 2 of [ -c flag ] ]:1

  eval "("
  ^~~~
[ -c flag ]:2: Unexpected EOF while parsing command
status=2
  )
  ^
[ eval word at line 5 of [ -c flag ] ]:1

  eval ")"
  ^~~~
[ -c flag ]:5: Invalid word while parsing command
status=2
  false
  ^~~~~
[ -c flag ]:9: errexit PID 10391: command.Simple failed with status 1

---------------------------

===== CASE: -c shopt --set ysh:upgrade; [[ 0 -eq 1 ]] =====


  shopt --set ysh:upgrade; [[ 0 -eq 1 ]]
                           ^~
[ -c flag ]:1: errexit PID 10393: command.DBracket failed with status 1

===== CASE: -c [[ 0 -eq 1 ]] =====


  [[ 0 -eq 1 ]]
  ^~
[ -c flag ]:1: Bash [[ not allowed in YSH (parse_dbracket)

---------------------------

===== CASE: -c shopt --set ysh:upgrade; (( 0 )) =====


  shopt --set ysh:upgrade; (( 0 ))
                           ^~
[ -c flag ]:1: errexit PID 10398: command.DParen failed with status 1

===== CASE: -c (( 0 )) =====


  (( 0 ))
  ^~
[ -c flag ]:1: Bash (( not allowed in YSH (parse_dparen, see OILS-ERR-14 for wart)
OK  test-errexit-one-process
*** Running test-errexit_alias

===== CASE: -c set -o errexit; type foo; foo /nonexistent =====


foo: not found
OK  test-errexit_alias
*** Running test-errexit_dbracket

===== CASE: -c set -o errexit; [[ -n "" ]]; echo UNREACHABLE =====


OK  test-errexit_dbracket
*** Running test-errexit_subshell

===== CASE: -c set -o errexit; ( echo subshell; exit 42; ) =====


subshell
OK  test-errexit_subshell
*** Running test-errexit_usage_error

===== CASE: -c set -o errexit; type -z =====


  set -o errexit; type -z
                       ^~
[ -c flag ]:1: 'type' doesn't accept flag -z
OK  test-errexit_usage_error
*** Running test-eval_bad_syntax

===== CASE: -c 
code="if foo; echo ls; fi"
eval "echo --
     $code"
 =====


--
       if foo; echo ls; fi
                        ^~
[ eval word at line 3 of [ -c flag ] ]:2

  eval "echo --
  ^~~~
[ -c flag ]:3: Expected word type Id.KW_Then, got Id.KW_Fi
OK  test-eval_bad_syntax
*** Running test-external_cmd_typed_args

===== CASE: -c cat ("myfile") =====


  cat ("myfile")
      ^
[ -c flag ]:1: fatal: 'cat' appears to be external. External commands don't accept typed args (OILS-ERR-200)
OK  test-external_cmd_typed_args
*** Running test-failed_command

===== CASE: -c set -o errexit; false; echo UNREACHABLE =====


OK  test-failed_command
*** Running test-fallback_locations

===== CASE: -c echo hi > / =====


  echo hi > /
          ^
[ -c flag ]:1: Can't open '/': Is a directory
[ -c flag ]:1: I/O error applying redirect: Is a directory

===== CASE: -c s=x; (( s[0] )) =====


  s=x; (( s[0] ))
       ^~
[ -c flag ]:1: fatal: Expected array or assoc in index expression, got Str

===== CASE: -c s=x; (( s[0] = 42 )) =====


  s=x; (( s[0] = 42 ))
          ^
[ -c flag ]:1: fatal: Can't assign to items in a string

===== CASE: -c set -u; (( undef )) =====


  set -u; (( undef ))
             ^~~~~
[ -c flag ]:1: fatal: Undefined variable 'undef'

===== CASE: -c (( 3 ** -2 )) =====


  (( 3 ** -2 ))
           ^
[ -c flag ]:1: fatal: Exponent can't be a negative number


===== CASE: -c set -u; [[ $undef =~ . ]] =====


  set -u; [[ $undef =~ . ]]
             ^~~~~~
[ -c flag ]:1: fatal: Undefined variable 'undef'

===== CASE: -c [[ $x =~ $(( 3 ** -2 )) ]] =====


  [[ $x =~ $(( 3 ** -2 )) ]]
                     ^
[ -c flag ]:1: fatal: Exponent can't be a negative number

===== CASE: -c type -x =====


  type -x
       ^~
[ -c flag ]:1: 'type' doesn't accept flag -x

===== CASE: -c use x =====


  use x
      ^
[ -c flag ]:1: 'use' expected 'bin' or 'dialect'

===== CASE: -c export -f =====


  export -f
  ^~~~~~
[ -c flag ]:1: 'export' doesn't accept -f because it's dangerous.  (The code can usually be restructured with 'source')

===== CASE: -c s=$(true) y=$(( 3 ** -2 )) =====


  s=$(true) y=$(( 3 ** -2 ))
                        ^
[ -c flag ]:1: fatal: Exponent can't be a negative number

===== CASE: -c if s=$(true) y=$(( 3 ** -2 )); then echo hi; fi =====


  if s=$(true) y=$(( 3 ** -2 )); then echo hi; fi
                           ^
[ -c flag ]:1: fatal: Exponent can't be a negative number

===== CASE: -c shopt -s strict_arith; x=a; echo $(( x )) =====


  a
  ^
[ var ? at line 1 of [ -c flag ] ]:1: fatal: Undefined value in arithmetic context

===== CASE: -c shopt -s strict_arith; x=a; echo $(( $x )) =====


  a
  ^
[ var ? at line 1 of [ -c flag ] ]:1: fatal: Undefined value in arithmetic context

===== CASE: -c shopt -s strict_arith; x=a; [[ $x -gt 3 ]] =====


  a
  ^
[ var ? at line 1 of [ -c flag ] ]:1: fatal: Undefined value in arithmetic context

===== CASE: -c shopt -s strict_arith; shopt -u eval_unsafe_arith; x=a; [[ $x -gt 3 ]] =====


  a
  ^
[ var ? at line 1 of [ -c flag ] ]:1: fatal: Undefined value in arithmetic context

===== CASE: -c shopt -s strict_arith; x=0xgg; echo $(( x )) =====


  shopt -s strict_arith; x=0xgg; echo $(( x ))
                                          ^
[ -c flag ]:1: fatal: Invalid hex constant '0xgg'
done
OK  test-fallback_locations
*** Running test-no_such_command

===== CASE: -c set -o errexit; ZZZZZ; echo UNREACHABLE =====


  set -o errexit; ZZZZZ; echo UNREACHABLE
                  ^~~~~
[ -c flag ]:1: 'ZZZZZ' not found (OILS-ERR-100)
OK  test-no_such_command
*** Running test-no_such_command_commandsub

===== CASE: -c set -o errexit; echo $(ZZZZZ); echo UNREACHABLE =====


  set -o errexit; echo $(ZZZZZ); echo UNREACHABLE
                         ^~~~~
[ -c flag ]:1: 'ZZZZZ' not found (OILS-ERR-100)

UNREACHABLE

===== CASE: -c set -o errexit; shopt -s command_sub_errexit; echo $(ZZZZZ); echo UNREACHABLE =====


  set -o errexit; shopt -s command_sub_errexit; echo $(ZZZZZ); echo UNREACHABLE
                                                       ^~~~~
[ -c flag ]:1: 'ZZZZZ' not found (OILS-ERR-100)
OK  test-no_such_command_commandsub
*** Running test-source_bad_syntax

===== CASE: -c . _tmp/bad-syntax.sh =====


  if foo; echo ls; fi
                   ^~
_tmp/bad-syntax.sh:1: Expected word type Id.KW_Then, got Id.KW_Fi
OK  test-source_bad_syntax
*** Running test-strict_errexit_1

===== CASE: [strict_errexit] ! { echo 1; echo 2; } =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! { echo 1; echo 2; } =====


  set -o errexit; shopt -s strict_errexit; ! { echo 1; echo 2; }
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] { echo 1; echo 2; } && true =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; { echo 1; echo 2; } && true =====


  set -o errexit; shopt -s strict_errexit; { echo 1; echo 2; } && true
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.BraceGroup). 


===== CASE: [strict_errexit] { echo 1; echo 2; } || true =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; { echo 1; echo 2; } || true =====


  set -o errexit; shopt -s strict_errexit; { echo 1; echo 2; } || true
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.BraceGroup). 


===== CASE: [strict_errexit] { echo 1; echo 2; } && true && true =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; { echo 1; echo 2; } && true && true =====


  set -o errexit; shopt -s strict_errexit; { echo 1; echo 2; } && true && true
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.BraceGroup). 


===== CASE: [strict_errexit] true && { echo 1; echo 2; } || true || true =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; true && { echo 1; echo 2; } || true || true =====


  set -o errexit; shopt -s strict_errexit; true && { echo 1; echo 2; } || true || true
                                                   ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.BraceGroup). 


===== CASE: [strict_errexit] true && true && { echo 1; echo 2; } || true || true =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; true && true && { echo 1; echo 2; } || true || true =====


  set -o errexit; shopt -s strict_errexit; true && true && { echo 1; echo 2; } || true || true
                                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.BraceGroup). 


===== CASE: [strict_errexit] if { echo 1; echo 2; }; then echo IF; fi =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; if { echo 1; echo 2; }; then echo IF; fi =====


  set -o errexit; shopt -s strict_errexit; if { echo 1; echo 2; }; then echo IF; fi
                                                                 ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Sentence). 


===== CASE: [strict_errexit] while { echo 1; echo 2; }; do echo WHILE; done =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; while { echo 1; echo 2; }; do echo WHILE; done =====


  set -o errexit; shopt -s strict_errexit; while { echo 1; echo 2; }; do echo WHILE; done
                                                                    ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Sentence). 


===== CASE: [strict_errexit] until { echo 1; echo 2; }; do echo UNTIL; done =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; until { echo 1; echo 2; }; do echo UNTIL; done =====


  set -o errexit; shopt -s strict_errexit; until { echo 1; echo 2; }; do echo UNTIL; done
                                                                    ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Sentence). 


===== CASE: [strict_errexit] shopt -s ysh:upgrade
                        proc p { echo p }
                        if p { echo hi } =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; shopt -s ysh:upgrade
                        proc p { echo p }
                        if p { echo hi } =====


                          if p { echo hi }
                          ^~
[ -c flag ]:3: errexit was disabled for this construct

                          if p { echo hi }
                             ^
[ -c flag ]:3: fatal: Can't run a proc while errexit is disabled. Use 'try' or wrap it in a process with $0 myproc

OK  test-strict_errexit_1
*** Running test-strict_errexit_conditionals

===== CASE: [strict_errexit] 
myfunc() { return 1; }

while ( myfunc )
do
  echo yes
done
 =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; 
myfunc() { return 1; }

while ( myfunc )
do
  echo yes
done
 =====


  while ( myfunc )
        ^
[ -c flag ]:4: fatal: strict_errexit only allows simple commands in conditionals (got command.Subshell). 


===== CASE: [strict_errexit] 
myfunc() { return 1; }

while test "$(myfunc)" != ""
do
  echo yes
done
 =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; 
myfunc() { return 1; }

while test "$(myfunc)" != ""
do
  echo yes
done
 =====


  while test "$(myfunc)" != ""
              ^~
[ -c flag ]:4: fatal: Command subs not allowed here because status wouldn't be checked (strict_errexit)


===== CASE: [strict_errexit] 
myfunc() { return 1; }

if cat <(ls)
then
  echo yes
fi
 =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; 
myfunc() { return 1; }

if cat <(ls)
then
  echo yes
fi
 =====


  if cat <(ls)
         ^~
[ -c flag ]:4: fatal: Process subs not allowed here because status wouldn't be checked (strict_errexit)


===== CASE: [strict_errexit] 
myfunc() {
  return 1
}

set -o pipefail
while myfunc | cat
do
  echo yes
done
 =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; 
myfunc() {
  return 1
}

set -o pipefail
while myfunc | cat
do
  echo yes
done
 =====


  while myfunc | cat
               ^
[ -c flag ]:7: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] 
myfunc() {
  return 1
}

foo=$(true)

# test assignment without proc
while bar=$(false)
do
  echo yes
done

# issue 1007 was caused using command.ShAssignment, rather than the more common
# command.Sentence with ;
while spam=$(myfunc)
do
  echo yes
done
 =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; 
myfunc() {
  return 1
}

foo=$(true)

# test assignment without proc
while bar=$(false)
do
  echo yes
done

# issue 1007 was caused using command.ShAssignment, rather than the more common
# command.Sentence with ;
while spam=$(myfunc)
do
  echo yes
done
 =====


  while bar=$(false)
        ^~~~
[ -c flag ]:9: fatal: strict_errexit only allows simple commands in conditionals (got command.ShAssignment). 

OK  test-strict_errexit_conditionals
*** Running test-strict_errexit_old

===== CASE: [strict_errexit] if ls | wc -l; then echo Pipeline; fi =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; if ls | wc -l; then echo Pipeline; fi =====


  set -o errexit; shopt -s strict_errexit; if ls | wc -l; then echo Pipeline; fi
                                                        ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Sentence). 


===== CASE: [strict_errexit] if ! ls | wc -l; then echo Pipeline; fi =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; if ! ls | wc -l; then echo Pipeline; fi =====


  set -o errexit; shopt -s strict_errexit; if ! ls | wc -l; then echo Pipeline; fi
                                                          ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Sentence). 


===== CASE: [strict_errexit] if echo a && echo b; then echo AndOr; fi =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; if echo a && echo b; then echo AndOr; fi =====


  set -o errexit; shopt -s strict_errexit; if echo a && echo b; then echo AndOr; fi
                                                              ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Sentence). 


===== CASE: [strict_errexit] ! for x in a; do echo $x; done =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! for x in a; do echo $x; done =====


  set -o errexit; shopt -s strict_errexit; ! for x in a; do echo $x; done
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] _func() { echo; }; ! _func =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; _func() { echo; }; ! _func =====


  set -o errexit; shopt -s strict_errexit; _func() { echo; }; ! _func
                                                              ^
[ -c flag ]:1: errexit was disabled for this construct

  set -o errexit; shopt -s strict_errexit; _func() { echo; }; ! _func
                                                                ^~~~~
[ -c flag ]:1: fatal: Can't run a proc while errexit is disabled. Use 'try' or wrap it in a process with $0 myproc


===== CASE: [strict_errexit] ! { echo brace; }; echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! { echo brace; }; echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! { echo brace; }; echo "should not get here"
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] ! ( echo subshell ); echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! ( echo subshell ); echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! ( echo subshell ); echo "should not get here"
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] ! while false; do echo while; done; echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! while false; do echo while; done; echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! while false; do echo while; done; echo "should not get here"
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] ! if true; then false; fi; echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! if true; then false; fi; echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! if true; then false; fi; echo "should not get here"
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] ! case x in x) echo x;; esac; echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! case x in x) echo x;; esac; echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! case x in x) echo x;; esac; echo "should not get here"
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] ! time echo hi; echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! time echo hi; echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! time echo hi; echo "should not get here"
                                           ^
[ -c flag ]:1: fatal: strict_errexit only allows simple commands in conditionals (got command.Pipeline). 


===== CASE: [strict_errexit] ! echo $(echo hi); echo "should not get here" =====


===== CASE: -c set -o errexit; shopt -s strict_errexit; ! echo $(echo hi); echo "should not get here" =====


  set -o errexit; shopt -s strict_errexit; ! echo $(echo hi); echo "should not get here"
                                                  ^~
[ -c flag ]:1: fatal: Command subs not allowed here because status wouldn't be checked (strict_errexit)

OK  test-strict_errexit_old
*** Running test-unsafe_arith_eval

===== CASE: -c 
  local e1=1+
  local e2="e1 + 5"
  echo $(( e2 ))  # recursively references e1
   =====


  1+
    ^
[ var ? at line 1 of [ var ? at line 4 of [ -c flag ] ] ]:1: Unexpected end of input
  1+
    ^
[ var ? at line 1 of [ var ? at line 4 of [ -c flag ] ] ]:1: fatal: Parse error in recursive arithmetic
OK  test-unsafe_arith_eval
*** Running test-unset_expr

===== CASE: -c unset -v 1[1] =====


  1[1]
  ^
[ dynamic LHS word at line 1 of [ -c flag ] ]:1

  unset -v 1[1]
           ^
[ -c flag ]:1: fatal: Invalid variable name '1'

===== CASE: -c unset -v 1+2 =====


  unset -v 1+2
  ^~~~~
[ -c flag ]:1: fatal: Invalid LHS to modify
OK  test-unset_expr

test/runtime-errors.sh: 27 tests passed.