modernc.org/ccgo/v3@v3.16.14/lib/testdata/tcc-0.9.27/tests/tests2/92_enum_bitfield.c (about)

     1  /* This checks if enums needing 8 bit but only having positive
     2     values are correctly zero extended (instead of sign extended)
     3     when stored into/loaded from a 8 bit bit-field of enum type (which
     4     itself is implementation defined, so isn't necessarily supported by all
     5     other compilers).  */
     6  enum tree_code {
     7    SOME_CODE = 148, /* has bit 7 set, and hence all further enum values as well */
     8    LAST_AND_UNUSED_TREE_CODE
     9  };
    10  typedef union tree_node *tree;
    11  struct tree_common
    12  {
    13    union tree_node *chain;
    14    union tree_node *type;
    15    enum tree_code code : 8;
    16    unsigned side_effects_flag : 1;
    17  };
    18  union tree_node
    19  {
    20    struct tree_common common;
    21   };
    22  enum c_tree_code {
    23    C_DUMMY_TREE_CODE = LAST_AND_UNUSED_TREE_CODE,
    24    STMT_EXPR,
    25    LAST_C_TREE_CODE
    26  };
    27  enum cplus_tree_code {
    28    CP_DUMMY_TREE_CODE = LAST_C_TREE_CODE,
    29    AMBIG_CONV,
    30    LAST_CPLUS_TREE_CODE
    31  };
    32  
    33  extern int printf(const char *, ...);
    34  int blah(){return 0;}
    35  
    36  int convert_like_real (tree convs)
    37  {
    38    switch (((enum tree_code) (convs)->common.code))
    39      {
    40      case AMBIG_CONV: /* This has bit 7 set, which must not be the sign
    41  			bit in tree_common.code, i.e. the bitfield must
    42  			be somehow marked unsigned.  */
    43        return blah();
    44      default:
    45        break;
    46      };
    47     printf("unsigned enum bit-fields broken\n");
    48  }
    49  
    50  int main()
    51  {
    52    union tree_node convs;
    53  
    54    convs.common.code = AMBIG_CONV;
    55    convert_like_real (&convs);
    56    return 0;
    57  }