1 static enum ENUM_TYPE_A { VALUE_A } var_a;
2 static enum ENUM_TYPE_B { VALUE_B } var_b;
3 static enum /* anon. */ { VALUE_C } anon_enum_var;
4 static int i;
5 
take_enum_of_type_a(enum ENUM_TYPE_A arg_enum)6 static void take_enum_of_type_a(enum ENUM_TYPE_A arg_enum)
7 {
8 	(void) arg_enum;
9 }
10 
take_int(int arg_int)11 static void take_int(int arg_int)
12 {
13 	(void) arg_int;
14 }
15 
always_ok(void)16 static void always_ok(void)
17 {
18 	var_a ++;
19 	var_a = VALUE_A;
20 	var_a = (enum ENUM_TYPE_A) VALUE_B;
21 	var_b = (enum ENUM_TYPE_B) i;
22 	i = (int) VALUE_A;
23 	anon_enum_var = VALUE_C;
24 	i = VALUE_C;
25 	i = anon_enum_var;
26 	i = 7;
27 	var_a = (enum ENUM_TYPE_A) 0;
28 	anon_enum_var = (__typeof__(anon_enum_var)) 0;
29 	anon_enum_var = (__typeof__(anon_enum_var)) VALUE_A;
30 
31 	switch (var_a) {
32 		case VALUE_A:
33 		default:
34 			take_enum_of_type_a(var_a);
35 			take_enum_of_type_a(VALUE_A);
36 	}
37 
38 	switch (anon_enum_var) {
39 		case VALUE_C:
40 		default:
41 			take_int(anon_enum_var);
42 	}
43 
44 	switch (i) {
45 		case VALUE_C:
46 		default:
47 			take_int(VALUE_C);
48 	}
49 }
50 
trigger_enum_mismatch(void)51 static void trigger_enum_mismatch(void)
52 {
53 	switch (var_a) {
54 		case VALUE_B:
55 		case VALUE_C:
56 		default:
57 			take_enum_of_type_a(var_b);
58 			take_enum_of_type_a(VALUE_B);
59 	}
60 
61 	switch (anon_enum_var) {
62 		case VALUE_A:
63 		default:
64 			take_enum_of_type_a(anon_enum_var);
65 			take_enum_of_type_a(VALUE_C);
66 	}
67 
68 	// this has been already working in sparse 0.4.1
69 	var_a = var_b;
70 	var_b = anon_enum_var;
71 	anon_enum_var = var_a;
72 
73 	// implemented after sparse 0.4.1
74 	var_a = VALUE_B;
75 	var_b = VALUE_C;
76 	anon_enum_var = VALUE_A;
77 }
78 
trigger_int_to_enum_conversion(void)79 static void trigger_int_to_enum_conversion(void)
80 {
81 	switch (var_a) {
82 		case 0:
83 		default:
84 			take_enum_of_type_a(i);
85 			take_enum_of_type_a(7);
86 	}
87 	var_a = 0;
88 	var_b = i;
89 	anon_enum_var = 0;
90 	anon_enum_var = i;
91 	var_a = (int) VALUE_A;
92 	var_a = (int) VALUE_B;
93 }
94 
trigger_enum_to_int_conversion(void)95 static void trigger_enum_to_int_conversion(void)
96 {
97 	i = var_a;
98 	i = VALUE_B;
99 	switch (i) {
100 		case VALUE_A:
101 		case VALUE_B:
102 		default:
103 			take_int(var_a);
104 			take_int(VALUE_B);
105 	}
106 }
107 
108 /*
109  * check-name: enum-common
110  * check-description: common part of the test for -Wenum-mismatch, -Wenum-to-int and -Wint-to-enum
111  * check-command: sparse -Wno-enum-mismatch -Wno-int-to-enum $file
112  */
113