cond-op-parentheses.mk revision 1.9 1 1.9 rillig # $NetBSD: cond-op-parentheses.mk,v 1.9 2025/06/28 22:39:28 rillig Exp $
2 1.1 rillig #
3 1.5 rillig # Tests for parentheses in .if conditions, which group expressions to override
4 1.5 rillig # the precedence of the operators '!', '&&' and '||'. Parentheses cannot be
5 1.5 rillig # used to form arithmetic expressions such as '(3+4)' though.
6 1.1 rillig
7 1.5 rillig # Contrary to the C family of programming languages, the outermost condition
8 1.5 rillig # does not have to be enclosed in parentheses.
9 1.5 rillig .if defined(VAR)
10 1.5 rillig . error
11 1.5 rillig .elif !1
12 1.5 rillig . error
13 1.5 rillig .endif
14 1.5 rillig
15 1.5 rillig # Parentheses cannot enclose numbers as there is no need for it. Make does
16 1.5 rillig # not implement any arithmetic functions in its condition parser. If
17 1.5 rillig # absolutely necessary, use expr(1).
18 1.6 rillig #
19 1.6 rillig # XXX: It's inconsistent that the right operand has unbalanced parentheses.
20 1.6 rillig #
21 1.9 rillig # expect+1: Comparison with ">" requires both operands "3" and "(2" to be numeric
22 1.5 rillig .if 3 > (2)
23 1.5 rillig .endif
24 1.9 rillig # expect+1: Malformed conditional "(3) > 2"
25 1.5 rillig .if (3) > 2
26 1.5 rillig .endif
27 1.1 rillig
28 1.3 rillig # Test for deeply nested conditions.
29 1.3 rillig .if (((((((((((((((((((((((((((((((((((((((((((((((((((((((( \
30 1.3 rillig (((((((((((((((((((((((((((((((((((((((((((((((((((((((( \
31 1.3 rillig 1 \
32 1.3 rillig )))))))))))))))))))))))))))))))))))))))))))))))))))))))) \
33 1.3 rillig ))))))))))))))))))))))))))))))))))))))))))))))))))))))))
34 1.5 rillig # Parentheses can be nested at least to depth 112. There is nothing special
35 1.5 rillig # about this number though, much higher numbers work as well, at least on
36 1.5 rillig # NetBSD. The actual limit depends on the allowed call stack depth for C code
37 1.5 rillig # of the platform. Anyway, 112 should be enough for all practical purposes.
38 1.3 rillig .else
39 1.3 rillig . error
40 1.3 rillig .endif
41 1.3 rillig
42 1.4 rillig # An unbalanced opening parenthesis is a parse error.
43 1.9 rillig # expect+1: Malformed conditional "("
44 1.4 rillig .if (
45 1.4 rillig . error
46 1.4 rillig .else
47 1.4 rillig . error
48 1.4 rillig .endif
49 1.4 rillig
50 1.4 rillig # An unbalanced closing parenthesis is a parse error.
51 1.4 rillig #
52 1.5 rillig # Before cond.c 1.237 from 2021-01-19, CondParser_Term returned TOK_RPAREN
53 1.5 rillig # even though the documentation of that function promised to only ever return
54 1.5 rillig # TOK_TRUE, TOK_FALSE or TOK_ERROR. In cond.c 1.241, the return type of that
55 1.5 rillig # function was changed to a properly restricted enum type, to prevent this bug
56 1.5 rillig # from occurring again.
57 1.9 rillig # expect+1: Malformed conditional ")"
58 1.4 rillig .if )
59 1.4 rillig . error
60 1.4 rillig .else
61 1.4 rillig . error
62 1.4 rillig .endif
63 1.4 rillig
64 1.1 rillig all:
65 1.1 rillig @:;
66