From c0f9012bed2e0646d15d454cffb971f4b7368edf Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 16 Jun 2017 14:34:38 -0400 Subject: parseh: fix not recognizing integer suffixes on hex numbers --- src/parseh.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'src/parseh.cpp') diff --git a/src/parseh.cpp b/src/parseh.cpp index ddf8cb11e8..fa474850b2 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -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; -- cgit v1.2.3