expr_precedence.c revision 1.5 1 1.5 rillig /* $NetBSD: expr_precedence.c,v 1.5 2021/07/26 17:27:22 rillig Exp $ */
2 1.1 rillig # 3 "expr_precedence.c"
3 1.1 rillig
4 1.1 rillig /*
5 1.1 rillig * Tests for the precedence among operators.
6 1.1 rillig */
7 1.1 rillig
8 1.1 rillig int var;
9 1.1 rillig
10 1.1 rillig /*
11 1.1 rillig * An initializer needs an assignment-expression; the comma must be
12 1.1 rillig * interpreted as a separator, not an operator.
13 1.1 rillig */
14 1.1 rillig /* expect+1: error: syntax error '4' [249] */
15 1.1 rillig int init_error = 3, 4;
16 1.1 rillig
17 1.1 rillig /* expect+1: error: non-constant initializer [177] */
18 1.1 rillig int init_syntactically_ok = var = 1 ? 2 : 3;
19 1.1 rillig
20 1.1 rillig /*
21 1.1 rillig * The arguments of __attribute__ must be constant-expression, as assignments
22 1.1 rillig * don't make sense at that point.
23 1.1 rillig */
24 1.1 rillig void __attribute__((format(printf,
25 1.3 rillig /*
26 1.3 rillig * Inside of __attribute__((...)), symbol lookup works differently. For
27 1.3 rillig * example, 'printf' is a keyword, and since all arguments to
28 1.3 rillig * __attribute__ are constant expressions, looking up global variables
29 1.3 rillig * would not make sense. Therefore, 'var' is undefined.
30 1.3 rillig *
31 1.3 rillig * See lex.c, function 'search', keyword 'attron'.
32 1.3 rillig */
33 1.3 rillig /* expect+2: error: 'var' undefined [99] */
34 1.2 rillig /* expect+1: syntax error '=' [249] */
35 1.1 rillig var = 1,
36 1.1 rillig /* Syntactically ok, must be a constant expression though. */
37 1.1 rillig var > 0 ? 2 : 1)))
38 1.1 rillig my_printf(const char *, ...);
39 1.4 rillig
40 1.4 rillig void
41 1.4 rillig assignment_associativity(int arg)
42 1.4 rillig {
43 1.4 rillig int left, right;
44 1.4 rillig
45 1.5 rillig /*
46 1.5 rillig * Assignments are right-associative. If they were left-associative,
47 1.5 rillig * the result of (left = right) would be an rvalue, resulting in this
48 1.5 rillig * error message: 'left operand of '=' must be lvalue [114]'.
49 1.5 rillig */
50 1.4 rillig left = right = arg;
51 1.4 rillig
52 1.4 rillig left = arg;
53 1.4 rillig }
54