case EXPR_LITERAL_MS_NOOP:
print_string("__noop");
return;
- case EXPR_LITERAL_INTEGER_HEXADECIMAL:
- case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL:
- print_string("0x");
- /* FALLTHROUGH */
+
case EXPR_LITERAL_BOOLEAN:
+ case EXPR_LITERAL_FLOATINGPOINT:
+ case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL:
case EXPR_LITERAL_INTEGER:
+ case EXPR_LITERAL_INTEGER_HEXADECIMAL:
case EXPR_LITERAL_INTEGER_OCTAL:
- case EXPR_LITERAL_FLOATINGPOINT:
print_stringrep(&literal->value);
print_stringrep(&literal->suffix);
return;
return create_symconst(dbgi, entity);
}
-static bool try_create_integer(literal_expression_t *literal,
- type_t *type, unsigned char base)
+static bool try_create_integer(literal_expression_t *literal, type_t *type)
{
const char *string = literal->value.begin;
size_t size = literal->value.size;
assert(type->kind == TYPE_ATOMIC);
atomic_type_kind_t akind = type->atomic.akind;
- ir_mode *mode = atomic_modes[akind];
- ir_tarval *tv = new_integer_tarval_from_str(string, size, 1, base, mode);
+ ir_mode *const mode = atomic_modes[akind];
+ ir_tarval *const tv = new_tarval_from_str(string, size, mode);
if (tv == tarval_bad)
return false;
}
}
- unsigned base;
- switch (literal->base.kind) {
- case EXPR_LITERAL_INTEGER_OCTAL: base = 8; break;
- case EXPR_LITERAL_INTEGER: base = 10; break;
- case EXPR_LITERAL_INTEGER_HEXADECIMAL: base = 16; break;
- default: panic("invalid literal kind");
- }
-
tarval_int_overflow_mode_t old_mode = tarval_get_integer_overflow_mode();
/* now try if the constant is small enough for some types */
tarval_set_integer_overflow_mode(TV_OVERFLOW_BAD);
if (ls < 1) {
- if (sign <= 0 && try_create_integer(literal, type_int, base))
+ if (sign <= 0 && try_create_integer(literal, type_int))
goto finished;
- if (sign >= 0 && try_create_integer(literal, type_unsigned_int, base))
+ if (sign >= 0 && try_create_integer(literal, type_unsigned_int))
goto finished;
}
if (ls < 2) {
- if (sign <= 0 && try_create_integer(literal, type_long, base))
+ if (sign <= 0 && try_create_integer(literal, type_long))
goto finished;
- if (sign >= 0 && try_create_integer(literal, type_unsigned_long, base))
+ if (sign >= 0 && try_create_integer(literal, type_unsigned_long))
goto finished;
}
/* last try? then we should not report tarval_bad */
if (sign < 0)
tarval_set_integer_overflow_mode(TV_OVERFLOW_WRAP);
- if (sign <= 0 && try_create_integer(literal, type_long_long, base))
+ if (sign <= 0 && try_create_integer(literal, type_long_long))
goto finished;
/* last try */
assert(sign >= 0);
tarval_set_integer_overflow_mode(TV_OVERFLOW_WRAP);
- bool res = try_create_integer(literal, type_unsigned_long_long, base);
+ bool res = try_create_integer(literal, type_unsigned_long_long);
if (!res)
panic("internal error when parsing number literal");
break;
case EXPR_LITERAL_FLOATINGPOINT:
+ case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL:
tv = new_tarval_from_str(string, size, mode);
break;
- case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL: {
- char buffer[size + 2];
- memcpy(buffer, "0x", 2);
- memcpy(buffer+2, string, size);
- tv = new_tarval_from_str(buffer, size+2, mode);
- break;
- }
-
case EXPR_LITERAL_BOOLEAN:
if (string[0] == 't') {
tv = get_mode_one(mode);
bool is_float = false;
bool has_digits = false;
- assert(obstack_object_size(&symbol_obstack) == 0);
while (isxdigit(c)) {
has_digits = true;
obstack_1grow(&symbol_obstack, (char) c);
is_float ? T_FLOATINGPOINT_HEXADECIMAL : T_INTEGER_HEXADECIMAL;
if (!has_digits) {
- errorf(&lexer_token.base.source_position,
- "invalid number literal '0x%S'", &lexer_token.number.number);
+ errorf(&lexer_token.base.source_position, "invalid number literal '%S'", &lexer_token.number.number);
lexer_token.number.number.begin = "0";
lexer_token.number.number.size = 1;
}
assert(obstack_object_size(&symbol_obstack) == 0);
if (c == '0') {
+ obstack_1grow(&symbol_obstack, (char)c);
next_char();
if (c == 'x' || c == 'X') {
+ obstack_1grow(&symbol_obstack, (char)c);
next_char();
parse_number_hex();
return;
} else {
has_digits = true;
}
- obstack_1grow(&symbol_obstack, '0');
}
while (isdigit(c)) {