diff options
-rw-r--r-- | evaluate.c | 1 | ||||
-rw-r--r-- | parse.c | 3 | ||||
-rw-r--r-- | symbol.c | 12 | ||||
-rw-r--r-- | symbol.h | 7 |
4 files changed, 16 insertions, 7 deletions
@@ -455,7 +455,6 @@ static struct symbol *evaluate_add(struct expression *expr) #define MOD_SIZE (MOD_CHAR | MOD_SHORT | MOD_LONG | MOD_LONGLONG) #define MOD_IGNORE (MOD_TOPLEVEL | MOD_STORAGE | MOD_ADDRESSABLE | \ MOD_ASSIGNED | MOD_USERTYPE | MOD_FORCE | MOD_ACCESSED | MOD_EXPLICITLY_SIGNED) -#define MOD_SIGNEDNESS (MOD_SIGNED | MOD_UNSIGNED) const char * type_difference(struct symbol *target, struct symbol *source, unsigned long target_mod_ignore, unsigned long source_mod_ignore) @@ -488,9 +488,6 @@ static struct token *attribute_specifier(struct token *token, struct ctype *ctyp return token; } -#define MOD_SPECIALBITS (MOD_STRUCTOF | MOD_UNIONOF | MOD_ENUMOF | MOD_ATTRIBUTE | MOD_TYPEOF) -#define MOD_SPECIFIER (MOD_CHAR | MOD_SHORT | MOD_LONG | MOD_LONGLONG | MOD_SIGNED | MOD_UNSIGNED | MOD_EXPLICITLY_SIGNED) - struct symbol * ctype_integer(unsigned long spec) { static struct symbol *const integer_ctypes[][3] = { @@ -219,7 +219,7 @@ static struct symbol * examine_array_type(struct symbol *sym) static struct symbol *examine_bitfield_type(struct symbol *sym) { struct symbol *base_type = examine_base_type(sym); - unsigned long bit_size, alignment; + unsigned long bit_size, alignment, modifiers; if (!base_type) return sym; @@ -230,6 +230,12 @@ static struct symbol *examine_bitfield_type(struct symbol *sym) alignment = base_type->ctype.alignment; if (!sym->ctype.alignment) sym->ctype.alignment = alignment; + modifiers = base_type->ctype.modifiers; + + /* Bitfields are unsigned, unless the base type was explicitly signed */ + if (!(modifiers & MOD_EXPLICITLY_SIGNED)) + modifiers = (modifiers & ~MOD_SIGNED) | MOD_UNSIGNED; + sym->ctype.modifiers |= modifiers & MOD_SIGNEDNESS; return sym; } @@ -293,6 +299,9 @@ static struct symbol * examine_node_type(struct symbol *sym) bit_size = base_type->bit_size; alignment = base_type->ctype.alignment; + /* Pick up signedness information into the node */ + sym->ctype.modifiers |= (MOD_SIGNEDNESS & base_type->ctype.modifiers); + if (!sym->ctype.alignment) sym->ctype.alignment = alignment; @@ -318,6 +327,7 @@ static struct symbol *examine_enum_type(struct symbol *sym) sym->bit_size = -1; return sym; } + sym->ctype.modifiers |= (base_type->ctype.modifiers & MOD_SIGNEDNESS); sym->bit_size = bits_in_enum; if (base_type->bit_size > sym->bit_size) sym->bit_size = base_type->bit_size; @@ -122,8 +122,6 @@ struct symbol { #define MOD_STATIC 0x0004 #define MOD_EXTERN 0x0008 -#define MOD_STORAGE (MOD_AUTO | MOD_REGISTER | MOD_STATIC | MOD_EXTERN | MOD_INLINE | MOD_TOPLEVEL) - #define MOD_CONST 0x0010 #define MOD_VOLATILE 0x0020 #define MOD_SIGNED 0x0040 @@ -159,6 +157,11 @@ struct symbol { #define MOD_EXPLICITLY_SIGNED 0x40000000 #define MOD_BITWISE 0x80000000 +#define MOD_STORAGE (MOD_AUTO | MOD_REGISTER | MOD_STATIC | MOD_EXTERN | MOD_INLINE | MOD_TOPLEVEL) +#define MOD_SPECIALBITS (MOD_STRUCTOF | MOD_UNIONOF | MOD_ENUMOF | MOD_ATTRIBUTE | MOD_TYPEOF) +#define MOD_SIGNEDNESS (MOD_SIGNED | MOD_UNSIGNED | MOD_EXPLICITLY_SIGNED) +#define MOD_SPECIFIER (MOD_CHAR | MOD_SHORT | MOD_LONG | MOD_LONGLONG | MOD_SIGNEDNESS) + /* Current parsing/evaluation function */ extern struct symbol *current_fn; |