tests/lint: add tests for comparison between unnamed enums Since unnamed enum types cannot be used in type casts, there is no sensible way that this type mismatch could be resolved, without changing the definition of the enum type itself, but that may be in a non-modifiable header. Therefore, comparisons with enum constants of unnamed types cannot be sensibly warned about.diff -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/msg_130.c
(rillig)
--- src/tests/usr.bin/xlint/lint1/msg_130.c 2021/03/05 17:10:06 1.8
+++ src/tests/usr.bin/xlint/lint1/msg_130.c 2021/03/09 23:09:48 1.9
@@ -1,14 +1,14 @@ | @@ -1,14 +1,14 @@ | |||
1 | /* $NetBSD: msg_130.c,v 1.8 2021/03/05 17:10:06 rillig Exp $ */ | 1 | /* $NetBSD: msg_130.c,v 1.9 2021/03/09 23:09:48 rillig Exp $ */ | |
2 | # 3 "msg_130.c" | 2 | # 3 "msg_130.c" | |
3 | 3 | |||
4 | // Test for message: enum type mismatch: '%s' '%s' '%s' [130] | 4 | // Test for message: enum type mismatch: '%s' '%s' '%s' [130] | |
5 | 5 | |||
6 | /* See also msg_241.c, which covers unusual operators on enums. */ | 6 | /* See also msg_241.c, which covers unusual operators on enums. */ | |
7 | 7 | |||
8 | enum color { | 8 | enum color { | |
9 | RED = 1 << 0, | 9 | RED = 1 << 0, | |
10 | GREEN = 1 << 1, | 10 | GREEN = 1 << 1, | |
11 | BLUE = 1 << 2 | 11 | BLUE = 1 << 2 | |
12 | }; | 12 | }; | |
13 | 13 | |||
14 | enum size { | 14 | enum size { | |
@@ -43,13 +43,50 @@ example(_Bool cond, enum color c, enum s | @@ -43,13 +43,50 @@ example(_Bool cond, enum color c, enum s | |||
43 | void | 43 | void | |
44 | switch_example(enum color c) | 44 | switch_example(enum color c) | |
45 | { | 45 | { | |
46 | switch (c) { | 46 | switch (c) { | |
47 | case EVENING: /* expect: 130 */ | 47 | case EVENING: /* expect: 130 */ | |
48 | case LARGE: /* expect: 130 */ | 48 | case LARGE: /* expect: 130 */ | |
49 | case 0: /* expect: 130 */ | 49 | case 0: /* expect: 130 */ | |
50 | sink(1 == 1); | 50 | sink(1 == 1); | |
51 | break; | 51 | break; | |
52 | default: | 52 | default: | |
53 | break; | 53 | break; | |
54 | } | 54 | } | |
55 | } | 55 | } | |
56 | ||||
57 | /* | |||
58 | * Unnamed enum types can be used as a container for constants, especially | |||
59 | * since in C90 and C99, even after the declaration 'static const int x = 3', | |||
60 | * 'x' is not a constant expression. | |||
61 | */ | |||
62 | enum { | |||
63 | sizeof_int = sizeof(int), | |||
64 | sizeof_long = sizeof(long) | |||
65 | }; | |||
66 | ||||
67 | enum { | |||
68 | sizeof_uint = sizeof(unsigned int) | |||
69 | }; | |||
70 | ||||
71 | int | |||
72 | enum_constant_from_unnamed_type(int x) | |||
73 | { | |||
74 | switch (x) { | |||
75 | case sizeof_int: /* expect: 130 *//* FIXME */ | |||
76 | return 1; | |||
77 | case sizeof_long: /* expect: 130 *//* FIXME */ | |||
78 | return 2; | |||
79 | default: | |||
80 | break; | |||
81 | } | |||
82 | ||||
83 | if (x == sizeof_int) | |||
84 | return 4; | |||
85 | if (x > sizeof_int) | |||
86 | return 5; | |||
87 | ||||
88 | if (sizeof_int == sizeof_uint) /* expect: 130 *//* FIXME */ | |||
89 | return 6; | |||
90 | ||||
91 | return 0; | |||
92 | } |
--- src/tests/usr.bin/xlint/lint1/Attic/msg_130.exp 2021/03/05 17:10:06 1.6
+++ src/tests/usr.bin/xlint/lint1/Attic/msg_130.exp 2021/03/09 23:09:48 1.7
@@ -1,6 +1,9 @@ | @@ -1,6 +1,9 @@ | |||
1 | msg_130.c(29): warning: enum type mismatch: 'enum color' ':' 'enum daytime' [130] | 1 | msg_130.c(29): warning: enum type mismatch: 'enum color' ':' 'enum daytime' [130] | |
2 | msg_130.c(31): warning: enum type mismatch: 'enum color' '!=' 'enum size' [130] | 2 | msg_130.c(31): warning: enum type mismatch: 'enum color' '!=' 'enum size' [130] | |
3 | msg_130.c(32): warning: enum type mismatch: 'enum color' '==' 'enum size' [130] | 3 | msg_130.c(32): warning: enum type mismatch: 'enum color' '==' 'enum size' [130] | |
4 | msg_130.c(47): warning: enum type mismatch: 'enum color' '==' 'enum daytime' [130] | 4 | msg_130.c(47): warning: enum type mismatch: 'enum color' '==' 'enum daytime' [130] | |
5 | msg_130.c(48): warning: enum type mismatch: 'enum color' '==' 'enum size' [130] | 5 | msg_130.c(48): warning: enum type mismatch: 'enum color' '==' 'enum size' [130] | |
6 | msg_130.c(49): warning: enum type mismatch: 'enum color' '==' 'int' [130] | 6 | msg_130.c(49): warning: enum type mismatch: 'enum color' '==' 'int' [130] | |
7 | msg_130.c(75): warning: enum type mismatch: 'int' '==' 'enum <unnamed>' [130] | |||
8 | msg_130.c(77): warning: enum type mismatch: 'int' '==' 'enum <unnamed>' [130] | |||
9 | msg_130.c(88): warning: enum type mismatch: 'enum <unnamed>' '==' 'enum <unnamed>' [130] |