Module Name:    src
Committed By:   rillig
Date:           Tue Jul  6 17:33:07 UTC 2021

Modified Files:
        src/distrib/sets/lists/tests: mi
        src/tests/usr.bin/xlint/lint1: Makefile gcc_attribute.c
            gcc_attribute.exp
Added Files:
        src/tests/usr.bin/xlint/lint1: gcc_attribute_enum.c
            gcc_attribute_enum.exp gcc_attribute_func.c gcc_attribute_func.exp
            gcc_attribute_label.c gcc_attribute_label.exp gcc_attribute_stmt.c
            gcc_attribute_stmt.exp gcc_attribute_type.c gcc_attribute_type.exp
            gcc_attribute_var.c gcc_attribute_var.exp

Log Message:
tests/lint: add tests for GCC __attribute__

Before fixing the wrong handling of __attribute__ that is demonstrated
at the end of gcc_attribute.c, ensure that the attribute handling works
in the most basic cases.

Lint currently accepts __attribute__ in more places than it should.
This leads to some ambiguities in the grammar.


To generate a diff of this commit:
cvs rdiff -u -r1.1076 -r1.1077 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.79 -r1.80 src/tests/usr.bin/xlint/lint1/Makefile
cvs rdiff -u -r1.6 -r1.7 src/tests/usr.bin/xlint/lint1/gcc_attribute.c
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/gcc_attribute.exp
cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.c \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.exp \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_func.c \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_func.exp \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_label.c \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_label.exp \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.c \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.exp \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_type.c \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_type.exp \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_var.c \
    src/tests/usr.bin/xlint/lint1/gcc_attribute_var.exp

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.1076 src/distrib/sets/lists/tests/mi:1.1077
--- src/distrib/sets/lists/tests/mi:1.1076	Sun Jul  4 20:22:31 2021
+++ src/distrib/sets/lists/tests/mi	Tue Jul  6 17:33:07 2021
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1076 2021/07/04 20:22:31 rillig Exp $
+# $NetBSD: mi,v 1.1077 2021/07/06 17:33:07 rillig Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -6219,6 +6219,18 @@
 ./usr/tests/usr.bin/xlint/lint1/gcc_attribute.exp		tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c		tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.exp	tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_enum.c		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_enum.exp		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_func.c		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_func.exp		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_label.c		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_label.exp		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.c		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.exp		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_type.c		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_type.exp		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_var.c		tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/gcc_attribute_var.exp		tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/gcc_bit_field_types.c		tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/gcc_bit_field_types.exp		tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/gcc_init_compound_literal.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.79 src/tests/usr.bin/xlint/lint1/Makefile:1.80
--- src/tests/usr.bin/xlint/lint1/Makefile:1.79	Sun Jul  4 20:22:31 2021
+++ src/tests/usr.bin/xlint/lint1/Makefile	Tue Jul  6 17:33:07 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.79 2021/07/04 20:22:31 rillig Exp $
+# $NetBSD: Makefile,v 1.80 2021/07/06 17:33:07 rillig Exp $
 
 NOMAN=		# defined
 MAX_MESSAGE=	345		# see lint1/err.c
@@ -121,6 +121,18 @@ FILES+=		gcc_attribute.c
 FILES+=		gcc_attribute.exp
 FILES+=		gcc_attribute_aligned.c
 FILES+=		gcc_attribute_aligned.exp
+FILES+=		gcc_attribute_enum.c
+FILES+=		gcc_attribute_enum.exp
+FILES+=		gcc_attribute_func.c
+FILES+=		gcc_attribute_func.exp
+FILES+=		gcc_attribute_label.c
+FILES+=		gcc_attribute_label.exp
+FILES+=		gcc_attribute_stmt.c
+FILES+=		gcc_attribute_stmt.exp
+FILES+=		gcc_attribute_type.c
+FILES+=		gcc_attribute_type.exp
+FILES+=		gcc_attribute_var.c
+FILES+=		gcc_attribute_var.exp
 FILES+=		gcc_bit_field_types.c
 FILES+=		gcc_bit_field_types.exp
 FILES+=		gcc_init_compound_literal.c

Index: src/tests/usr.bin/xlint/lint1/gcc_attribute.c
diff -u src/tests/usr.bin/xlint/lint1/gcc_attribute.c:1.6 src/tests/usr.bin/xlint/lint1/gcc_attribute.c:1.7
--- src/tests/usr.bin/xlint/lint1/gcc_attribute.c:1.6	Tue Jul  6 06:38:29 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute.c	Tue Jul  6 17:33:07 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gcc_attribute.c,v 1.6 2021/07/06 06:38:29 rillig Exp $	*/
+/*	$NetBSD: gcc_attribute.c,v 1.7 2021/07/06 17:33:07 rillig Exp $	*/
 # 3 "gcc_attribute.c"
 
 /*
@@ -6,12 +6,6 @@
  * provided by GCC.
  *
  * https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html
- * https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
- * https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
- * https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
- * https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html
- * https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html
- * https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html
  */
 
 void __attribute__((noinline))

Index: src/tests/usr.bin/xlint/lint1/gcc_attribute.exp
diff -u src/tests/usr.bin/xlint/lint1/gcc_attribute.exp:1.5 src/tests/usr.bin/xlint/lint1/gcc_attribute.exp:1.6
--- src/tests/usr.bin/xlint/lint1/gcc_attribute.exp:1.5	Mon May  3 07:08:54 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute.exp	Tue Jul  6 17:33:07 2021
@@ -1 +1 @@
-gcc_attribute.c(39): error: syntax error 'unknown_attribute' [249]
+gcc_attribute.c(33): error: syntax error 'unknown_attribute' [249]

Added files:

Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.c:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.c	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,22 @@
+/*	$NetBSD: gcc_attribute_enum.c,v 1.1 2021/07/06 17:33:07 rillig Exp $	*/
+# 3 "gcc_attribute_enum.c"
+
+/*
+ * Tests for the GCC __attribute__ for enumerators.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html
+ */
+
+enum Planet {
+	Mercury,
+	Venus,
+	Earth,
+	Mars,
+	Jupiter,
+	Saturn,
+	Uranus,
+	Neptune,
+	/* https://en.wikipedia.org/wiki/Pluto_(planet) */
+	/*FIXME*//* expect+1: error: syntax error '__attribute__' [249] */
+	Pluto __attribute__((__deprecated__ /* since August 2006 */))
+};
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.exp
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.exp:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_enum.exp	Tue Jul  6 17:33:07 2021
@@ -0,0 +1 @@
+gcc_attribute_enum.c(21): error: syntax error '__attribute__' [249]
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_func.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_func.c:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_func.c	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,26 @@
+/*	$NetBSD: gcc_attribute_func.c,v 1.1 2021/07/06 17:33:07 rillig Exp $	*/
+# 3 "gcc_attribute_func.c"
+
+/*
+ * Tests for the GCC __attribute__ for functions.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
+ */
+
+void deprecated_function(void)
+    __attribute__((__noreturn__))
+    __attribute__((__aligned__(8), __cold__))
+    __attribute__((__deprecated__("do not use while driving")));
+
+__attribute__((__cold__))
+void attribute_as_prefix(void);
+
+void __attribute__((__cold__)) attribute_after_type_spec(void);
+void *__attribute__((__cold__)) attribute_before_name(void);
+/*TODO: do not allow __attribute__ after function name */
+void *attribute_after_name __attribute__((__cold__))(void);
+void *attribute_after_parameters(void) __attribute__((__cold__));
+
+/* just to trigger _some_ error, to keep the .exp file */
+/* expect+1: error: syntax error 'syntax_error' [249] */
+__attribute__((syntax_error));
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_func.exp
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_func.exp:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_func.exp	Tue Jul  6 17:33:07 2021
@@ -0,0 +1 @@
+gcc_attribute_func.c(26): error: syntax error 'syntax_error' [249]
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_label.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_label.c:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_label.c	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,31 @@
+/*	$NetBSD: gcc_attribute_label.c,v 1.1 2021/07/06 17:33:07 rillig Exp $	*/
+# 3 "gcc_attribute_label.c"
+
+/*
+ * Tests for the GCC __attribute__ for labels.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html
+ */
+
+void dead(void);
+
+void
+test(int i)
+{
+	if (i < 1000)
+		goto hot;
+	/* TODO: add quotes to message 232 */
+	/*FIXME*//* expect+1: warning: label error unused in function test [232] */
+error:
+	__attribute__((__cold__));
+	dead();
+
+hot:
+	/* expect+1: error: syntax error '__hot__' [249] */
+	__attribute__((__hot__));
+	/*FIXME*//* expect+1: error: 'i' undefined [99] */
+	if (i < 0)
+		/* TODO: add quotes to message 23 */
+		/* expect+1: warning: undefined label error [23] */
+		goto error;
+}
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_label.exp
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_label.exp:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_label.exp	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,4 @@
+gcc_attribute_label.c(25): error: syntax error '__hot__' [249]
+gcc_attribute_label.c(27): error: 'i' undefined [99]
+gcc_attribute_label.c(19): warning: label error unused in function test [232]
+gcc_attribute_label.c(30): warning: undefined label error [23]
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.c:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.c	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,36 @@
+/*	$NetBSD: gcc_attribute_stmt.c,v 1.1 2021/07/06 17:33:07 rillig Exp $	*/
+# 3 "gcc_attribute_stmt.c"
+
+/*
+ * Tests for the GCC __attribute__ for statements.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html
+ */
+
+void println(const char *);
+
+void
+attribute_fallthrough(int i)
+{
+	switch (i) {
+	case 5:
+		/*
+		 * The attribute 'fallthrough' is only valid after a
+		 * preceding statement. This is already caught by GCC, so
+		 * lint does not need to care.
+		 */
+		__attribute__((__fallthrough__));
+	case 3:
+		println("odd");
+		__attribute__((__fallthrough__));
+	case 2:
+		/*
+		 * Only the null statement can have the attribute
+		 * 'fallthrough'. This is already caught by GCC, so
+		 * lint does not need to care.
+		 */
+		/* expect+2: error: syntax error '__attribute__' [249] */
+		println("prime")
+		    __attribute__((__fallthrough__));
+	}
+}
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.exp
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.exp:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_stmt.exp	Tue Jul  6 17:33:07 2021
@@ -0,0 +1 @@
+gcc_attribute_stmt.c(34): error: syntax error '__attribute__' [249]
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_type.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_type.c:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_type.c	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,29 @@
+/*	$NetBSD: gcc_attribute_type.c,v 1.1 2021/07/06 17:33:07 rillig Exp $	*/
+# 3 "gcc_attribute_type.c"
+
+/*
+ * Tests for the GCC __attribute__ for types.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
+ */
+
+struct __attribute__((__packed__)) packed_record {
+	unsigned char len[2];
+	unsigned long magic;
+};
+
+struct record_packed {
+	unsigned char len[2];
+	unsigned long magic;
+} __attribute__((__packed__));
+
+/* TODO: do not allow __attribute__ before 'struct' */
+__attribute__((__packed__))
+struct attribute_before_keyword {
+	unsigned char len[2];
+	unsigned long magic;
+};
+
+/* just to trigger _some_ error, to keep the .exp file */
+/* expect+1: error: syntax error 'syntax_error' [249] */
+__attribute__((syntax_error));
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_type.exp
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_type.exp:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_type.exp	Tue Jul  6 17:33:07 2021
@@ -0,0 +1 @@
+gcc_attribute_type.c(29): error: syntax error 'syntax_error' [249]
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_var.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_var.c:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_var.c	Tue Jul  6 17:33:07 2021
@@ -0,0 +1,28 @@
+/*	$NetBSD: gcc_attribute_var.c,v 1.1 2021/07/06 17:33:07 rillig Exp $	*/
+# 3 "gcc_attribute_var.c"
+
+/*
+ * Tests for the GCC __attribute__ for variables.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html
+ */
+
+void
+write_to_page(unsigned index, char ch)
+{
+	static char page[4096]
+	    __attribute__((__aligned__(4096)));
+
+	page[index] = ch;
+}
+
+void
+placement(
+    __attribute__((__deprecated__)) int before,
+    int __attribute__((__deprecated__)) between,
+    int after __attribute__((__deprecated__))
+);
+
+/* just to trigger _some_ error, to keep the .exp file */
+/* expect+1: error: syntax error 'syntax_error' [249] */
+__attribute__((syntax_error));
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_var.exp
diff -u /dev/null src/tests/usr.bin/xlint/lint1/gcc_attribute_var.exp:1.1
--- /dev/null	Tue Jul  6 17:33:07 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_var.exp	Tue Jul  6 17:33:07 2021
@@ -0,0 +1 @@
+gcc_attribute_var.c(28): error: syntax error 'syntax_error' [249]

Reply via email to