Module Name:    src
Committed By:   rillig
Date:           Thu May  9 20:56:41 UTC 2024

Modified Files:
        src/tests/usr.bin/xlint/lint1: c23.c
        src/usr.bin/xlint/lint1: cgram.y

Log Message:
lint: in C23 mode, allow storage classes in compound literals


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/c23.c
cvs rdiff -u -r1.498 -r1.499 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/c23.c
diff -u src/tests/usr.bin/xlint/lint1/c23.c:1.11 src/tests/usr.bin/xlint/lint1/c23.c:1.12
--- src/tests/usr.bin/xlint/lint1/c23.c:1.11	Thu May  9 11:08:07 2024
+++ src/tests/usr.bin/xlint/lint1/c23.c	Thu May  9 20:56:41 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: c23.c,v 1.11 2024/05/09 11:08:07 rillig Exp $	*/
+/*	$NetBSD: c23.c,v 1.12 2024/05/09 20:56:41 rillig Exp $	*/
 # 3 "c23.c"
 
 // Tests for the option -Ac23, which allows features from C23 and all earlier
@@ -42,6 +42,29 @@ null_pointer_constant(const char *p, dou
 }
 
 
+void *
+storage_class_in_compound_literal(void)
+{
+	typedef struct node node;
+	struct node {
+		node *left;
+		int value;
+		node *right;
+	};
+
+	node *tree;
+	tree = &(static node){
+	    &(static node){
+		nullptr,
+		3,
+		nullptr,
+	    },
+	    5,
+	    nullptr,
+	};
+	return tree->left;
+}
+
 int
 empty_initializer_braces(void)
 {

Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.498 src/usr.bin/xlint/lint1/cgram.y:1.499
--- src/usr.bin/xlint/lint1/cgram.y:1.498	Thu May  9 20:22:20 2024
+++ src/usr.bin/xlint/lint1/cgram.y	Thu May  9 20:56:41 2024
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.498 2024/05/09 20:22:20 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.499 2024/05/09 20:56:41 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.498 2024/05/09 20:22:20 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.499 2024/05/09 20:56:41 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -306,6 +306,7 @@ is_either(const char *s, const char *a, 
 %type	<y_tnode>	gcc_statement_expr_item
 %type	<y_op>		point_or_arrow
 %type	<y_arguments>	argument_expression_list
+%type	<y_scl>		storage_class_specifiers
 %type	<y_tnode>	unary_expression
 %type	<y_tnode>	cast_expression
 %type	<y_tnode>	expression_opt
@@ -332,6 +333,7 @@ is_either(const char *s, const char *a, 
 /* No type for type_init_declarator_list. */
 /* No type for notype_init_declarator. */
 /* No type for type_init_declarator. */
+%type	<y_scl>		storage_class_specifier
 %type	<y_type>	type_specifier
 %type	<y_type>	notype_type_specifier
 %type	<y_type>	struct_or_union_specifier
@@ -606,6 +608,19 @@ postfix_expression:
 		$$ = build_name(current_initsym(), false);
 		end_initialization();
 	}
+	/* Rule 'compound_literal' with storage classes from C23 6.5.3.6. */
+|	T_LPAREN storage_class_specifiers type_name T_RPAREN {
+		sym_t *tmp = mktempsym($3);
+		tmp->s_scl = $2;
+		begin_initialization(tmp);
+		cgram_declare(tmp, true, NULL);
+	} braced_initializer {
+		if (!allow_c99)
+			 /* compound literals are a C99/GCC extension */
+			 gnuism(319);
+		$$ = build_name(current_initsym(), false);
+		end_initialization();
+	}
 |	T_LPAREN compound_statement_lbrace {
 		begin_statement_expr();
 	} gcc_statement_expr_list {
@@ -682,7 +697,14 @@ argument_expression_list:
 /* C23 6.5.3.6 */
 /* The rule 'compound_literal' is inlined into 'postfix_expression'. */
 
-/* TODO: Implement 'storage_class_specifiers' from C23 6.5.3.6. */
+/* C23 6.5.3.6 */
+storage_class_specifiers:
+	storage_class_specifier
+|	storage_class_specifiers storage_class_specifier {
+		// TODO C23: maybe merge multiple storage class specifiers
+		$$ = $1;
+	}
+;
 
 /* K&R 7.2, C90 ???, C99 6.5.3, C11 6.5.3, C23 6.5.4 */
 unary_expression:
@@ -1048,7 +1070,10 @@ type_init_declarator:
 
 /* TODO: Implement 'attribute_declaration' from C23 6.7.1. */
 
-/* TODO: Implement 'storage_class_specifier' from C23 6.7.2. */
+/* K&R ???, C90 ???, C99 ???, C11 ???, C23 6.7.2 */
+storage_class_specifier:
+	T_SCLASS
+;
 
 /* C99 6.7.2, C23 6.7.3.1 */
 type_specifier:

Reply via email to