parseh: fix not recognizing integer suffixes on hex numbers

This commit is contained in:
Andrew Kelley
2017-06-16 14:34:38 -04:00
parent 865b53f286
commit c0f9012bed
4 changed files with 189 additions and 71 deletions

View File

@@ -162,12 +162,16 @@ static Tld *create_global_str_lit_var(Context *c, Buf *name, Buf *value) {
return &tld_var->base;
}
static Tld *create_global_num_lit_unsigned_negative(Context *c, Buf *name, uint64_t x, bool negative) {
ConstExprValue *var_val = create_const_unsigned_negative(c->codegen->builtin_types.entry_num_lit_int, x, negative);
static Tld *create_global_num_lit_unsigned_negative_type(Context *c, Buf *name, uint64_t x, bool negative, TypeTableEntry *type_entry) {
ConstExprValue *var_val = create_const_unsigned_negative(type_entry, x, negative);
TldVar *tld_var = create_global_var(c, name, var_val, true);
return &tld_var->base;
}
static Tld *create_global_num_lit_unsigned_negative(Context *c, Buf *name, uint64_t x, bool negative) {
return create_global_num_lit_unsigned_negative_type(c, name, x, negative, c->codegen->builtin_types.entry_num_lit_int);
}
static Tld *create_global_num_lit_float(Context *c, Buf *name, double value) {
ConstExprValue *var_val = create_const_float(c->codegen->builtin_types.entry_num_lit_float, value);
TldVar *tld_var = create_global_var(c, name, var_val, true);
@@ -1149,7 +1153,32 @@ static void process_macro(Context *c, CTokenize *ctok, Buf *name, const char *ch
return;
case CTokIdNumLitInt:
if (is_last) {
Tld *tld = create_global_num_lit_unsigned_negative(c, name, tok->data.num_lit_int, negate);
Tld *tld;
switch (tok->data.num_lit_int.suffix) {
case CNumLitSuffixNone:
tld = create_global_num_lit_unsigned_negative(c, name, tok->data.num_lit_int.x, negate);
break;
case CNumLitSuffixL:
tld = create_global_num_lit_unsigned_negative_type(c, name, tok->data.num_lit_int.x, negate,
c->codegen->builtin_types.entry_c_int[CIntTypeLong]);
break;
case CNumLitSuffixU:
tld = create_global_num_lit_unsigned_negative_type(c, name, tok->data.num_lit_int.x, negate,
c->codegen->builtin_types.entry_c_int[CIntTypeUInt]);
break;
case CNumLitSuffixLU:
tld = create_global_num_lit_unsigned_negative_type(c, name, tok->data.num_lit_int.x, negate,
c->codegen->builtin_types.entry_c_int[CIntTypeULong]);
break;
case CNumLitSuffixLL:
tld = create_global_num_lit_unsigned_negative_type(c, name, tok->data.num_lit_int.x, negate,
c->codegen->builtin_types.entry_c_int[CIntTypeLongLong]);
break;
case CNumLitSuffixLLU:
tld = create_global_num_lit_unsigned_negative_type(c, name, tok->data.num_lit_int.x, negate,
c->codegen->builtin_types.entry_c_int[CIntTypeULongLong]);
break;
}
c->macro_table.put(name, tld);
}
return;