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]