Module Name: src Committed By: rillig Date: Thu Jul 15 17:20:58 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: expr_precedence.c expr_precedence.exp src/usr.bin/xlint/lint1: cgram.y Log Message: lint: in the grammar, replace %prec with explicit rules This way, in the arguments of __attribute__, where only constant expressions are expected, a '=' leads to a syntax error. Previously, this was not detected. No noticeable change in practice since these cases are already handled by the compilers. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/expr_precedence.c \ src/tests/usr.bin/xlint/lint1/expr_precedence.exp cvs rdiff -u -r1.324 -r1.325 src/usr.bin/xlint/lint1/cgram.y Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/xlint/lint1/expr_precedence.c diff -u src/tests/usr.bin/xlint/lint1/expr_precedence.c:1.1 src/tests/usr.bin/xlint/lint1/expr_precedence.c:1.2 --- src/tests/usr.bin/xlint/lint1/expr_precedence.c:1.1 Thu Jul 15 17:09:08 2021 +++ src/tests/usr.bin/xlint/lint1/expr_precedence.c Thu Jul 15 17:20:58 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: expr_precedence.c,v 1.1 2021/07/15 17:09:08 rillig Exp $ */ +/* $NetBSD: expr_precedence.c,v 1.2 2021/07/15 17:20:58 rillig Exp $ */ # 3 "expr_precedence.c" /* @@ -23,9 +23,8 @@ int init_syntactically_ok = var = 1 ? 2 */ void __attribute__((format(printf, /* expect+2: error: 'var' undefined [99] */ /* XXX: why? */ - /* XXX: allow only constant-expression, not assignment-expression */ + /* expect+1: syntax error '=' [249] */ var = 1, /* Syntactically ok, must be a constant expression though. */ - /* expect+1: error: 'var' undefined [99] */ var > 0 ? 2 : 1))) my_printf(const char *, ...); Index: src/tests/usr.bin/xlint/lint1/expr_precedence.exp diff -u src/tests/usr.bin/xlint/lint1/expr_precedence.exp:1.1 src/tests/usr.bin/xlint/lint1/expr_precedence.exp:1.2 --- src/tests/usr.bin/xlint/lint1/expr_precedence.exp:1.1 Thu Jul 15 17:09:08 2021 +++ src/tests/usr.bin/xlint/lint1/expr_precedence.exp Thu Jul 15 17:20:58 2021 @@ -1,4 +1,4 @@ expr_precedence.c(15): error: syntax error '4' [249] expr_precedence.c(18): error: non-constant initializer [177] expr_precedence.c(27): error: 'var' undefined [99] -expr_precedence.c(30): error: 'var' undefined [99] +expr_precedence.c(27): error: syntax error '=' [249] Index: src/usr.bin/xlint/lint1/cgram.y diff -u src/usr.bin/xlint/lint1/cgram.y:1.324 src/usr.bin/xlint/lint1/cgram.y:1.325 --- src/usr.bin/xlint/lint1/cgram.y:1.324 Wed Jul 14 17:19:37 2021 +++ src/usr.bin/xlint/lint1/cgram.y Thu Jul 15 17:20:57 2021 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: cgram.y,v 1.324 2021/07/14 17:19:37 rillig Exp $ */ +/* $NetBSD: cgram.y,v 1.325 2021/07/15 17:20:57 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: cgram.y,v 1.324 2021/07/14 17:19:37 rillig Exp $"); +__RCSID("$NetBSD: cgram.y,v 1.325 2021/07/15 17:20:57 rillig Exp $"); #endif #include <limits.h> @@ -295,9 +295,10 @@ anonymize(sym_t *s) %type <y_tnode> argument_expression_list %type <y_tnode> unary_expression %type <y_tnode> cast_expression +%type <y_tnode> conditional_expression +%type <y_tnode> assignment_expression %type <y_tnode> expression_opt %type <y_tnode> expression -%type <y_tnode> assignment_expression %type <y_tnode> constant_expr %type <y_type> begin_type_typespec @@ -562,10 +563,10 @@ point_or_arrow: /* helper for 'postfix /* K&R 7.1, C90 ???, C99 6.5.2, C11 6.5.2 */ argument_expression_list: - expression %prec T_COMMA { + assignment_expression { $$ = new_function_argument_node(NULL, $1); } - | argument_expression_list T_COMMA expression { + | argument_expression_list T_COMMA assignment_expression { $$ = new_function_argument_node($1, $3); } ; @@ -635,71 +636,74 @@ expression_opt: | expression ; -/* 'expression' also implements 'multiplicative_expression'. */ -/* 'expression' also implements 'additive_expression'. */ -/* 'expression' also implements 'shift_expression'. */ -/* 'expression' also implements 'relational_expression'. */ -/* 'expression' also implements 'equality_expression'. */ -/* 'expression' also implements 'AND_expression'. */ -/* 'expression' also implements 'exclusive_OR_expression'. */ -/* 'expression' also implements 'inclusive_OR_expression'. */ -/* 'expression' also implements 'logical_AND_expression'. */ -/* 'expression' also implements 'logical_OR_expression'. */ -/* 'expression' also implements 'conditional_expression'. */ -/* 'expression' also implements 'assignment_expression'. */ -/* K&R ???, C90 ???, C99 6.5.5 to 6.5.17, C11 ??? */ -expression: - expression T_ASTERISK expression { +/* 'conditional_expression' also implements 'multiplicative_expression'. */ +/* 'conditional_expression' also implements 'additive_expression'. */ +/* 'conditional_expression' also implements 'shift_expression'. */ +/* 'conditional_expression' also implements 'relational_expression'. */ +/* 'conditional_expression' also implements 'equality_expression'. */ +/* 'conditional_expression' also implements 'AND_expression'. */ +/* 'conditional_expression' also implements 'exclusive_OR_expression'. */ +/* 'conditional_expression' also implements 'inclusive_OR_expression'. */ +/* 'conditional_expression' also implements 'logical_AND_expression'. */ +/* 'conditional_expression' also implements 'logical_OR_expression'. */ +/* K&R ???, C90 ???, C99 6.5.5 to 6.5.15, C11 6.5.5 to 6.5.15 */ +conditional_expression: + conditional_expression T_ASTERISK conditional_expression { $$ = build(MULT, $1, $3); } - | expression T_MULTIPLICATIVE expression { + | conditional_expression T_MULTIPLICATIVE conditional_expression { $$ = build($2, $1, $3); } - | expression T_ADDITIVE expression { + | conditional_expression T_ADDITIVE conditional_expression { $$ = build($2, $1, $3); } - | expression T_SHIFT expression { + | conditional_expression T_SHIFT conditional_expression { $$ = build($2, $1, $3); } - | expression T_RELATIONAL expression { + | conditional_expression T_RELATIONAL conditional_expression { $$ = build($2, $1, $3); } - | expression T_EQUALITY expression { + | conditional_expression T_EQUALITY conditional_expression { $$ = build($2, $1, $3); } - | expression T_AMPER expression { + | conditional_expression T_AMPER conditional_expression { $$ = build(BITAND, $1, $3); } - | expression T_BITXOR expression { + | conditional_expression T_BITXOR conditional_expression { $$ = build(BITXOR, $1, $3); } - | expression T_BITOR expression { + | conditional_expression T_BITOR conditional_expression { $$ = build(BITOR, $1, $3); } - | expression T_LOGAND expression { + | conditional_expression T_LOGAND conditional_expression { $$ = build(LOGAND, $1, $3); } - | expression T_LOGOR expression { + | conditional_expression T_LOGOR conditional_expression { $$ = build(LOGOR, $1, $3); } - | expression T_QUEST expression T_COLON expression { + | conditional_expression T_QUEST conditional_expression + T_COLON conditional_expression { $$ = build(QUEST, $1, build(COLON, $3, $5)); } - | expression T_ASSIGN expression { + | cast_expression; + +/* K&R ???, C90 ???, C99 6.5.16, C11 6.5.16 */ +assignment_expression: + conditional_expression + | assignment_expression T_ASSIGN conditional_expression { $$ = build(ASSIGN, $1, $3); } - | expression T_OPASSIGN expression { + | assignment_expression T_OPASSIGN conditional_expression { $$ = build($2, $1, $3); } - | expression T_COMMA expression { - $$ = build(COMMA, $1, $3); - } - | cast_expression ; -/* K&R ???, C90 ???, C99 6.5.16, C11 ??? */ -assignment_expression: - expression %prec T_ASSIGN +/* K&R ???, C90 ???, C99 6.5.17, C11 6.5.17 */ +expression: + assignment_expression + | expression T_COMMA assignment_expression { + $$ = build(COMMA, $1, $3); + } ; constant_expr_list_opt: /* helper for gcc_attribute */ @@ -713,7 +717,7 @@ constant_expr_list: /* helper for gcc_a ; constant_expr: /* C99 6.6 */ - expression %prec T_ASSIGN + conditional_expression ; declaration: /* C99 6.7 */ @@ -1506,7 +1510,7 @@ parameter_declaration: ; initializer: /* C99 6.7.8 "Initialization" */ - expression %prec T_COMMA { + assignment_expression { init_expr($1); } | init_lbrace init_rbrace {