12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /* This checks if enums needing 8 bit but only having positive
- values are correctly zero extended (instead of sign extended)
- when stored into/loaded from a 8 bit bit-field of enum type (which
- itself is implementation defined, so isn't necessarily supported by all
- other compilers). */
- enum tree_code {
- SOME_CODE = 148, /* has bit 7 set, and hence all further enum values as well */
- LAST_AND_UNUSED_TREE_CODE
- };
- typedef union tree_node *tree;
- struct tree_common
- {
- union tree_node *chain;
- union tree_node *type;
- enum tree_code code : 8;
- unsigned side_effects_flag : 1;
- };
- union tree_node
- {
- struct tree_common common;
- };
- enum c_tree_code {
- C_DUMMY_TREE_CODE = LAST_AND_UNUSED_TREE_CODE,
- STMT_EXPR,
- LAST_C_TREE_CODE
- };
- enum cplus_tree_code {
- CP_DUMMY_TREE_CODE = LAST_C_TREE_CODE,
- AMBIG_CONV,
- LAST_CPLUS_TREE_CODE
- };
- extern int printf(const char *, ...);
- int blah(){return 0;}
- int convert_like_real (tree convs)
- {
- switch (((enum tree_code) (convs)->common.code))
- {
- case AMBIG_CONV: /* This has bit 7 set, which must not be the sign
- bit in tree_common.code, i.e. the bitfield must
- be somehow marked unsigned. */
- return blah();
- default:
- break;
- };
- printf("unsigned enum bit-fields broken\n");
- }
- int main()
- {
- union tree_node convs;
- convs.common.code = AMBIG_CONV;
- convert_like_real (&convs);
- return 0;
- }
|