aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--evaluate.c1
-rw-r--r--parse.c3
-rw-r--r--symbol.c12
-rw-r--r--symbol.h7
4 files changed, 16 insertions, 7 deletions
diff --git a/evaluate.c b/evaluate.c
index e077bb9..f00ed63 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -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)
diff --git a/parse.c b/parse.c
index df0bd0b..1556e69 100644
--- a/parse.c
+++ b/parse.c
@@ -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] = {
diff --git a/symbol.c b/symbol.c
index 0cff753..21188f7 100644
--- a/symbol.c
+++ b/symbol.c
@@ -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;
diff --git a/symbol.h b/symbol.h
index 51d7511..b0d43da 100644
--- a/symbol.h
+++ b/symbol.h
@@ -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;