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 
   6 static void take_enum_of_type_a(enum ENUM_TYPE_A arg_enum)
   7 {
   8         (void) arg_enum;
   9 }
  10 
  11 static void take_int(int arg_int)
  12 {
  13         (void) arg_int;
  14 }
  15 
  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 
  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 
  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 
  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  */