Module Name:    src
Committed By:   rillig
Date:           Sun Jan 15 00:53:19 UTC 2023

Modified Files:
        src/distrib/sets/lists/tests: mi
        src/tests/usr.bin/xlint/lint1: Makefile
Added Files:
        src/tests/usr.bin/xlint/lint1: expr_sizeof.c

Log Message:
tests/lint: add test for parsing sizeof expressions


To generate a diff of this commit:
cvs rdiff -u -r1.1240 -r1.1241 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.130 -r1.131 src/tests/usr.bin/xlint/lint1/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/xlint/lint1/expr_sizeof.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1240 src/distrib/sets/lists/tests/mi:1.1241
--- src/distrib/sets/lists/tests/mi:1.1240	Sun Jan 15 00:34:10 2023
+++ src/distrib/sets/lists/tests/mi	Sun Jan 15 00:53:19 2023
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1240 2023/01/15 00:34:10 rillig Exp $
+# $NetBSD: mi,v 1.1241 2023/01/15 00:53:19 rillig Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -6553,6 +6553,7 @@
 ./usr/tests/usr.bin/xlint/lint1/expr_promote_trad.exp-ln	tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/expr_range.c			tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/expr_range.exp			tests-obsolete		obsolete,atf
+./usr/tests/usr.bin/xlint/lint1/expr_sizeof.c			tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/feat_stacktrace.c		tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/feat_stacktrace.exp		tests-obsolete		obsolete,atf
 ./usr/tests/usr.bin/xlint/lint1/gcc_attribute.c			tests-usr.bin-tests	compattestfile,atf

Index: src/tests/usr.bin/xlint/lint1/Makefile
diff -u src/tests/usr.bin/xlint/lint1/Makefile:1.130 src/tests/usr.bin/xlint/lint1/Makefile:1.131
--- src/tests/usr.bin/xlint/lint1/Makefile:1.130	Wed Jan  4 05:25:08 2023
+++ src/tests/usr.bin/xlint/lint1/Makefile	Sun Jan 15 00:53:19 2023
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.130 2023/01/04 05:25:08 rillig Exp $
+# $NetBSD: Makefile,v 1.131 2023/01/15 00:53:19 rillig Exp $
 
 NOMAN=		# defined
 MAX_MESSAGE=	349		# see lint1/err.c
@@ -111,6 +111,7 @@ FILES+=		expr_promote.exp-ln
 FILES+=		expr_promote_trad.c
 FILES+=		expr_promote_trad.exp-ln
 FILES+=		expr_range.c
+FILES+=		expr_sizeof.c
 FILES+=		feat_stacktrace.c
 FILES+=		gcc_attribute.c
 FILES+=		gcc_attribute_aligned.c

Added files:

Index: src/tests/usr.bin/xlint/lint1/expr_sizeof.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/expr_sizeof.c:1.1
--- /dev/null	Sun Jan 15 00:53:19 2023
+++ src/tests/usr.bin/xlint/lint1/expr_sizeof.c	Sun Jan 15 00:53:19 2023
@@ -0,0 +1,51 @@
+/*	$NetBSD: expr_sizeof.c,v 1.1 2023/01/15 00:53:19 rillig Exp $	*/
+# 3 "expr_sizeof.c"
+
+/*
+ * C99 6.5.3.4 "The sizeof operator"
+ * C11 6.5.3.4 "The sizeof operator"
+ */
+
+/*
+ * A sizeof expression can either take a type name or an expression.
+ */
+void sink(unsigned long);
+
+struct {
+	int member;
+} s, *ps;
+
+/*
+ * In a sizeof expression taking a type name, the type name must be enclosed
+ * in parentheses.
+ */
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_int[-(int)sizeof(int)];
+
+/*
+ * In a sizeof expression taking an expression, the expression may or may not
+ * be enclosed in parentheses, like any other expression.
+ */
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_paren_zero[-(int)sizeof(0)];
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_zero[-(int)sizeof 0];
+
+/*
+ * Even though 's' is not a constant expression, 'sizeof s' is.
+ */
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_global_var[-(int)sizeof s];
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_paren_global_var[-(int)sizeof(s)];
+
+/*
+ * Even though 'sizeof(s)' may look like a function call expression, the
+ * parentheses around 's' are ordinary parentheses and do not influence the
+ * associativity.  Therefore, the '.' following the '(s)' takes precedence
+ * over the 'sizeof'.  Same for the '->' following the '(ps)'.
+ */
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_paren_global_struct_member[-(int)sizeof(s).member];
+/* expect+1: error: negative array dimension (-4) [20] */
+typedef int sizeof_paren_global_ptr_struct_member[-(int)sizeof(ps)->member];

Reply via email to