Module Name:    src
Committed By:   rillig
Date:           Tue Aug  3 21:18:24 UTC 2021

Modified Files:
        src/tests/usr.bin/xlint/lint1: gcc_cast_union.c gcc_cast_union.exp
        src/usr.bin/xlint/lint1: decl.c

Log Message:
lint: in strict enum mode, error out on enum type mismatch in union cast


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/xlint/lint1/gcc_cast_union.c \
    src/tests/usr.bin/xlint/lint1/gcc_cast_union.exp
cvs rdiff -u -r1.218 -r1.219 src/usr.bin/xlint/lint1/decl.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/gcc_cast_union.c
diff -u src/tests/usr.bin/xlint/lint1/gcc_cast_union.c:1.2 src/tests/usr.bin/xlint/lint1/gcc_cast_union.c:1.3
--- src/tests/usr.bin/xlint/lint1/gcc_cast_union.c:1.2	Tue Aug  3 21:09:26 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_cast_union.c	Tue Aug  3 21:18:24 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gcc_cast_union.c,v 1.2 2021/08/03 21:09:26 rillig Exp $	*/
+/*	$NetBSD: gcc_cast_union.c,v 1.3 2021/08/03 21:18:24 rillig Exp $	*/
 # 3 "gcc_cast_union.c"
 
 /*
@@ -81,7 +81,7 @@ test(void)
 	any = (union anything)E1;
 	any = (union anything)E2;
 	/* GCC allows enum mismatch even with -Wenum-conversion */
-	/* XXX: Lint should warn about enum type mismatch */
+	/* expect+1: error: type 'enum other_enum' is not a member of 'union anything' [329] */
 	any = (union anything)OTHER;
 	/* expect+1: error: type 'pointer to char' is not a member of 'union anything' [329] */
 	any = (union anything)"char *";
Index: src/tests/usr.bin/xlint/lint1/gcc_cast_union.exp
diff -u src/tests/usr.bin/xlint/lint1/gcc_cast_union.exp:1.2 src/tests/usr.bin/xlint/lint1/gcc_cast_union.exp:1.3
--- src/tests/usr.bin/xlint/lint1/gcc_cast_union.exp:1.2	Tue Aug  3 21:09:26 2021
+++ src/tests/usr.bin/xlint/lint1/gcc_cast_union.exp	Tue Aug  3 21:18:24 2021
@@ -1,3 +1,4 @@
+gcc_cast_union.c(85): error: type 'enum other_enum' is not a member of 'union anything' [329]
 gcc_cast_union.c(87): error: type 'pointer to char' is not a member of 'union anything' [329]
 gcc_cast_union.c(90): error: type 'pointer to double' is not a member of 'union anything' [329]
 gcc_cast_union.c(92): error: type 'pointer to double' is not a member of 'union anything' [329]

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.218 src/usr.bin/xlint/lint1/decl.c:1.219
--- src/usr.bin/xlint/lint1/decl.c:1.218	Tue Aug  3 18:38:02 2021
+++ src/usr.bin/xlint/lint1/decl.c	Tue Aug  3 21:18:24 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.218 2021/08/03 18:38:02 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.219 2021/08/03 21:18:24 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.218 2021/08/03 18:38:02 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.219 2021/08/03 21:18:24 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -2225,6 +2225,9 @@ eqtype(const type_t *tp1, const type_t *
 		if (t == STRUCT || t == UNION)
 			return tp1->t_str == tp2->t_str;
 
+		if (t == ENUM && eflag)
+			return tp1->t_enum == tp2->t_enum;
+
 		if (t == ARRAY && tp1->t_dim != tp2->t_dim) {
 			if (tp1->t_dim != 0 && tp2->t_dim != 0)
 				return false;

Reply via email to