Module Name: src
Committed By: rillig
Date: Tue Aug 3 20:57:06 UTC 2021
Modified Files:
src/tests/usr.bin/xlint/lint1: d_c99_union_cast.c d_c99_union_cast.exp
msg_328.c msg_328.exp msg_329.c msg_329.exp
src/usr.bin/xlint/lint1: err.c tree.c
Log Message:
lint: union casts are only available as a GCC extension, not in C99
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/tests/usr.bin/xlint/lint1/d_c99_union_cast.c
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/d_c99_union_cast.exp
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/xlint/lint1/msg_328.c \
src/tests/usr.bin/xlint/lint1/msg_328.exp \
src/tests/usr.bin/xlint/lint1/msg_329.c
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_329.exp
cvs rdiff -u -r1.133 -r1.134 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.328 -r1.329 src/usr.bin/xlint/lint1/tree.c
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/d_c99_union_cast.c
diff -u src/tests/usr.bin/xlint/lint1/d_c99_union_cast.c:1.6 src/tests/usr.bin/xlint/lint1/d_c99_union_cast.c:1.7
--- src/tests/usr.bin/xlint/lint1/d_c99_union_cast.c:1.6 Tue Aug 3 20:46:10 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_union_cast.c Tue Aug 3 20:57:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: d_c99_union_cast.c,v 1.6 2021/08/03 20:46:10 rillig Exp $ */
+/* $NetBSD: d_c99_union_cast.c,v 1.7 2021/08/03 20:57:06 rillig Exp $ */
# 3 "d_c99_union_cast.c"
/* C99 does not define union cast, it is a GCC extension. */
@@ -18,9 +18,9 @@ union foo {
void
foo(struct bar *a)
{
- /* TODO: warn about union casts in general */
+ /* expect+1: error: union cast is a GCC extension [328] */
a = ((union foo)a).a;
- /* expect+1: error: type 'pointer to char' is not a member of 'union foo' [329] */
+ /* expect+1: error: union cast is a GCC extension [328] */
a = ((union foo)"string");
a->a++;
}
Index: src/tests/usr.bin/xlint/lint1/d_c99_union_cast.exp
diff -u src/tests/usr.bin/xlint/lint1/d_c99_union_cast.exp:1.5 src/tests/usr.bin/xlint/lint1/d_c99_union_cast.exp:1.6
--- src/tests/usr.bin/xlint/lint1/d_c99_union_cast.exp:1.5 Tue Aug 3 20:46:10 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_union_cast.exp Tue Aug 3 20:57:06 2021
@@ -1 +1,2 @@
-d_c99_union_cast.c(24): error: type 'pointer to char' is not a member of 'union foo' [329]
+d_c99_union_cast.c(22): error: union cast is a GCC extension [328]
+d_c99_union_cast.c(24): error: union cast is a GCC extension [328]
Index: src/tests/usr.bin/xlint/lint1/msg_328.c
diff -u src/tests/usr.bin/xlint/lint1/msg_328.c:1.2 src/tests/usr.bin/xlint/lint1/msg_328.c:1.3
--- src/tests/usr.bin/xlint/lint1/msg_328.c:1.2 Sun Feb 21 09:07:58 2021
+++ src/tests/usr.bin/xlint/lint1/msg_328.c Tue Aug 3 20:57:06 2021
@@ -1,7 +1,19 @@
-/* $NetBSD: msg_328.c,v 1.2 2021/02/21 09:07:58 rillig Exp $ */
+/* $NetBSD: msg_328.c,v 1.3 2021/08/03 20:57:06 rillig Exp $ */
# 3 "msg_328.c"
-// Test for message: union cast is a C9X feature [328]
+// Test for message: union cast is a GCC extension [328]
-TODO: "Add example code that triggers the above message." /* expect: 249 */
-TODO: "Add example code that almost triggers the above message."
+/* lint1-flags: -Sw */
+
+union target {
+ int b;
+};
+
+void
+foo(void)
+{
+ union target arg = { 123 };
+ /* expect+1: error: union cast is a GCC extension [328] */
+ arg = (union target)3;
+ arg.b++;
+}
Index: src/tests/usr.bin/xlint/lint1/msg_328.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_328.exp:1.2 src/tests/usr.bin/xlint/lint1/msg_328.exp:1.3
--- src/tests/usr.bin/xlint/lint1/msg_328.exp:1.2 Sun Mar 21 20:45:00 2021
+++ src/tests/usr.bin/xlint/lint1/msg_328.exp Tue Aug 3 20:57:06 2021
@@ -1 +1 @@
-msg_328.c(6): error: syntax error ':' [249]
+msg_328.c(17): error: union cast is a GCC extension [328]
Index: src/tests/usr.bin/xlint/lint1/msg_329.c
diff -u src/tests/usr.bin/xlint/lint1/msg_329.c:1.2 src/tests/usr.bin/xlint/lint1/msg_329.c:1.3
--- src/tests/usr.bin/xlint/lint1/msg_329.c:1.2 Sun Jan 24 17:44:37 2021
+++ src/tests/usr.bin/xlint/lint1/msg_329.c Tue Aug 3 20:57:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_329.c,v 1.2 2021/01/24 17:44:37 rillig Exp $ */
+/* $NetBSD: msg_329.c,v 1.3 2021/08/03 20:57:06 rillig Exp $ */
# 3 "msg_329.c"
// Test for message: type '%s' is not a member of '%s' [329]
@@ -30,9 +30,6 @@ example(void)
*
* This is a GCC extension.
* See https://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html.
- *
- * FIXME: lint says in message 328 that "union cast is a C9X feature",
- * but that is wrong. It is a GCC feature.
*/
union u u_i1 = (union u)3;
union u u_vp = (union u)(void *)0;
Index: src/tests/usr.bin/xlint/lint1/msg_329.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_329.exp:1.3 src/tests/usr.bin/xlint/lint1/msg_329.exp:1.4
--- src/tests/usr.bin/xlint/lint1/msg_329.exp:1.3 Sun Mar 21 20:45:00 2021
+++ src/tests/usr.bin/xlint/lint1/msg_329.exp Tue Aug 3 20:57:06 2021
@@ -1 +1 @@
-msg_329.c(39): error: type 'pointer to char' is not a member of 'union u' [329]
+msg_329.c(36): error: type 'pointer to char' is not a member of 'union u' [329]
Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.133 src/usr.bin/xlint/lint1/err.c:1.134
--- src/usr.bin/xlint/lint1/err.c:1.133 Tue Aug 3 18:44:33 2021
+++ src/usr.bin/xlint/lint1/err.c Tue Aug 3 20:57:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: err.c,v 1.133 2021/08/03 18:44:33 rillig Exp $ */
+/* $NetBSD: err.c,v 1.134 2021/08/03 20:57:06 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: err.c,v 1.133 2021/08/03 18:44:33 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.134 2021/08/03 20:57:06 rillig Exp $");
#endif
#include <sys/types.h>
@@ -382,7 +382,7 @@ const char *const msgs[] = {
"variable declaration in for loop", /* 325 */
"%s attribute ignored for %s", /* 326 */
"declarations after statements is a C99 feature", /* 327 */
- "union cast is a C9X feature", /* 328 */
+ "union cast is a GCC extension", /* 328 */
"type '%s' is not a member of '%s'", /* 329 */
"operand of '%s' must be bool, not '%s'", /* 330 */
"left operand of '%s' must be bool, not '%s'", /* 331 */
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.328 src/usr.bin/xlint/lint1/tree.c:1.329
--- src/usr.bin/xlint/lint1/tree.c:1.328 Tue Aug 3 18:38:02 2021
+++ src/usr.bin/xlint/lint1/tree.c Tue Aug 3 20:57:06 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.328 2021/08/03 18:38:02 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.329 2021/08/03 20:57:06 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.328 2021/08/03 18:38:02 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.329 2021/08/03 20:57:06 rillig Exp $");
#endif
#include <float.h>
@@ -3395,8 +3395,8 @@ cast(tnode_t *tn, type_t *tp)
} else if (nt == UNION) {
sym_t *m;
struct_or_union *str = tp->t_str;
- if (!Sflag) {
- /* union cast is a C9X feature */
+ if (!gflag) {
+ /* union cast is a GCC extension */
error(328);
return NULL;
}