1 1.5 rillig # $NetBSD: cond-short.mk,v 1.5 2020/07/02 13:04:09 rillig Exp $ 2 1.1 rillig # 3 1.1 rillig # Demonstrates that in conditions, the right-hand side of an && or || 4 1.2 rillig # is only evaluated if it can actually influence the result. 5 1.1 rillig # 6 1.2 rillig # Between 2015-10-11 and 2020-06-28, the right-hand side of an && or || 7 1.2 rillig # operator was always evaluated, which was wrong. 8 1.1 rillig # 9 1.2 rillig 10 1.2 rillig # The && operator. 11 1.1 rillig 12 1.1 rillig .if 0 && ${echo "unexpected and" 1>&2 :L:sh} 13 1.1 rillig .endif 14 1.1 rillig 15 1.1 rillig .if 1 && ${echo "expected and" 1>&2 :L:sh} 16 1.1 rillig .endif 17 1.1 rillig 18 1.2 rillig .if 0 && exists(nonexistent${echo "unexpected and exists" 1>&2 :L:sh}) 19 1.2 rillig .endif 20 1.2 rillig 21 1.2 rillig .if 1 && exists(nonexistent${echo "expected and exists" 1>&2 :L:sh}) 22 1.2 rillig .endif 23 1.2 rillig 24 1.2 rillig .if 0 && empty(${echo "unexpected and empty" 1>&2 :L:sh}) 25 1.2 rillig .endif 26 1.2 rillig 27 1.2 rillig .if 1 && empty(${echo "expected and empty" 1>&2 :L:sh}) 28 1.2 rillig .endif 29 1.2 rillig 30 1.4 rillig # "VAR U11" is not evaluated; it was evaluated before 2020-07-02. 31 1.4 rillig # The whole !empty condition is only parsed and then discarded. 32 1.3 rillig VAR= ${VAR${:U11${echo "unexpected VAR U11" 1>&2 :L:sh}}} 33 1.3 rillig VAR13= ${VAR${:U12${echo "unexpected VAR13" 1>&2 :L:sh}}} 34 1.3 rillig .if 0 && !empty(VAR${:U13${echo "unexpected U13 condition" 1>&2 :L:sh}}) 35 1.3 rillig .endif 36 1.3 rillig 37 1.3 rillig VAR= ${VAR${:U21${echo "unexpected VAR U21" 1>&2 :L:sh}}} 38 1.3 rillig VAR23= ${VAR${:U22${echo "expected VAR23" 1>&2 :L:sh}}} 39 1.3 rillig .if 1 && !empty(VAR${:U23${echo "expected U23 condition" 1>&2 :L:sh}}) 40 1.3 rillig .endif 41 1.5 rillig VAR= # empty again, for the following tests 42 1.3 rillig 43 1.5 rillig # The :M modifier is only parsed, not evaluated. 44 1.5 rillig # Before 2020-07-02, it was wrongly evaluated. 45 1.4 rillig .if 0 && !empty(VAR:M${:U${echo "unexpected M pattern" 1>&2 :L:sh}}) 46 1.4 rillig .endif 47 1.4 rillig 48 1.5 rillig .if 1 && !empty(VAR:M${:U${echo "expected M pattern" 1>&2 :L:sh}}) 49 1.5 rillig .endif 50 1.5 rillig 51 1.2 rillig # The || operator. 52 1.2 rillig 53 1.1 rillig .if 1 || ${echo "unexpected or" 1>&2 :L:sh} 54 1.1 rillig .endif 55 1.1 rillig 56 1.1 rillig .if 0 || ${echo "expected or" 1>&2 :L:sh} 57 1.1 rillig .endif 58 1.1 rillig 59 1.2 rillig .if 1 || exists(nonexistent${echo "unexpected or exists" 1>&2 :L:sh}) 60 1.2 rillig .endif 61 1.2 rillig 62 1.2 rillig .if 0 || exists(nonexistent${echo "expected or exists" 1>&2 :L:sh}) 63 1.2 rillig .endif 64 1.2 rillig 65 1.2 rillig .if 1 || empty(${echo "unexpected or empty" 1>&2 :L:sh}) 66 1.2 rillig .endif 67 1.2 rillig 68 1.2 rillig .if 0 || empty(${echo "expected or empty" 1>&2 :L:sh}) 69 1.2 rillig .endif 70 1.2 rillig 71 1.2 rillig # Unreachable nested conditions are skipped completely as well. 72 1.1 rillig 73 1.1 rillig .if 0 74 1.1 rillig . if ${echo "unexpected nested and" 1>&2 :L:sh} 75 1.1 rillig . endif 76 1.1 rillig .endif 77 1.1 rillig 78 1.1 rillig .if 1 79 1.1 rillig .elif ${echo "unexpected nested or" 1>&2 :L:sh} 80 1.1 rillig .endif 81 1.1 rillig 82 1.1 rillig all: 83 1.1 rillig @:;: 84