diff options
Diffstat (limited to 'usr/src/tools/smatch/src/validation/enum-common.c')
-rw-r--r-- | usr/src/tools/smatch/src/validation/enum-common.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/usr/src/tools/smatch/src/validation/enum-common.c b/usr/src/tools/smatch/src/validation/enum-common.c new file mode 100644 index 0000000000..f940fefacc --- /dev/null +++ b/usr/src/tools/smatch/src/validation/enum-common.c @@ -0,0 +1,112 @@ +static enum ENUM_TYPE_A { VALUE_A } var_a; +static enum ENUM_TYPE_B { VALUE_B } var_b; +static enum /* anon. */ { VALUE_C } anon_enum_var; +static int i; + +static void take_enum_of_type_a(enum ENUM_TYPE_A arg_enum) +{ + (void) arg_enum; +} + +static void take_int(int arg_int) +{ + (void) arg_int; +} + +static void always_ok(void) +{ + var_a ++; + var_a = VALUE_A; + var_a = (enum ENUM_TYPE_A) VALUE_B; + var_b = (enum ENUM_TYPE_B) i; + i = (int) VALUE_A; + anon_enum_var = VALUE_C; + i = VALUE_C; + i = anon_enum_var; + i = 7; + var_a = (enum ENUM_TYPE_A) 0; + anon_enum_var = (__typeof__(anon_enum_var)) 0; + anon_enum_var = (__typeof__(anon_enum_var)) VALUE_A; + + switch (var_a) { + case VALUE_A: + default: + take_enum_of_type_a(var_a); + take_enum_of_type_a(VALUE_A); + } + + switch (anon_enum_var) { + case VALUE_C: + default: + take_int(anon_enum_var); + } + + switch (i) { + case VALUE_C: + default: + take_int(VALUE_C); + } +} + +static void trigger_enum_mismatch(void) +{ + switch (var_a) { + case VALUE_B: + case VALUE_C: + default: + take_enum_of_type_a(var_b); + take_enum_of_type_a(VALUE_B); + } + + switch (anon_enum_var) { + case VALUE_A: + default: + take_enum_of_type_a(anon_enum_var); + take_enum_of_type_a(VALUE_C); + } + + // this has been already working in sparse 0.4.1 + var_a = var_b; + var_b = anon_enum_var; + anon_enum_var = var_a; + + // implemented after sparse 0.4.1 + var_a = VALUE_B; + var_b = VALUE_C; + anon_enum_var = VALUE_A; +} + +static void trigger_int_to_enum_conversion(void) +{ + switch (var_a) { + case 0: + default: + take_enum_of_type_a(i); + take_enum_of_type_a(7); + } + var_a = 0; + var_b = i; + anon_enum_var = 0; + anon_enum_var = i; + var_a = (int) VALUE_A; + var_a = (int) VALUE_B; +} + +static void trigger_enum_to_int_conversion(void) +{ + i = var_a; + i = VALUE_B; + switch (i) { + case VALUE_A: + case VALUE_B: + default: + take_int(var_a); + take_int(VALUE_B); + } +} + +/* + * check-name: enum-common + * check-description: common part of the test for -Wenum-mismatch, -Wenum-to-int and -Wint-to-enum + * check-command: sparse -Wno-enum-mismatch -Wno-int-to-enum $file + */ |