mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-28 04:00:06 +08:00
1b57560502
A more automatic approach to code suppression (aka. nocode_wanted) The simple rules are: - Clear 'nocode_wanted' at (im/explicit) label IF it was used - Set 'nocode_wanted' after unconditional jumps Also in order to test this then I did add the "function might return no value" warning, and then to make that work again I did add the __attribute__((noreturn)). Also moved the look ahead label check into the type parser to gain a little speed.
59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
/* 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");
|
|
return 0;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
union tree_node convs;
|
|
|
|
convs.common.code = AMBIG_CONV;
|
|
convert_like_real (&convs);
|
|
return 0;
|
|
}
|