1 1.4 rillig # $NetBSD: cond-short.mk,v 1.4 2020/07/02 12:37:18 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.3 rillig 42 1.4 rillig # FIXME: The :M modifier must only be parsed, not evaluated. 43 1.4 rillig .if 0 && !empty(VAR:M${:U${echo "unexpected M pattern" 1>&2 :L:sh}}) 44 1.4 rillig .endif 45 1.4 rillig 46 1.2 rillig # The || operator. 47 1.2 rillig 48 1.1 rillig .if 1 || ${echo "unexpected or" 1>&2 :L:sh} 49 1.1 rillig .endif 50 1.1 rillig 51 1.1 rillig .if 0 || ${echo "expected or" 1>&2 :L:sh} 52 1.1 rillig .endif 53 1.1 rillig 54 1.2 rillig .if 1 || exists(nonexistent${echo "unexpected or exists" 1>&2 :L:sh}) 55 1.2 rillig .endif 56 1.2 rillig 57 1.2 rillig .if 0 || exists(nonexistent${echo "expected or exists" 1>&2 :L:sh}) 58 1.2 rillig .endif 59 1.2 rillig 60 1.2 rillig .if 1 || empty(${echo "unexpected or empty" 1>&2 :L:sh}) 61 1.2 rillig .endif 62 1.2 rillig 63 1.2 rillig .if 0 || empty(${echo "expected or empty" 1>&2 :L:sh}) 64 1.2 rillig .endif 65 1.2 rillig 66 1.2 rillig # Unreachable nested conditions are skipped completely as well. 67 1.1 rillig 68 1.1 rillig .if 0 69 1.1 rillig . if ${echo "unexpected nested and" 1>&2 :L:sh} 70 1.1 rillig . endif 71 1.1 rillig .endif 72 1.1 rillig 73 1.1 rillig .if 1 74 1.1 rillig .elif ${echo "unexpected nested or" 1>&2 :L:sh} 75 1.1 rillig .endif 76 1.1 rillig 77 1.1 rillig all: 78 1.1 rillig @:;: 79