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 {

Reply via email to