- Just keep EXPR_LITERAL_INTEGER.
- Only in create_integer_tarval() it is necessary to know, whether an integer constant ist decimal, but this test is easy (first char != '0').
[EXPR_REFERENCE] = PREC_PRIMARY,
[EXPR_ENUM_CONSTANT] = PREC_PRIMARY,
[EXPR_LITERAL_INTEGER] = PREC_PRIMARY,
- [EXPR_LITERAL_INTEGER_OCTAL] = PREC_PRIMARY,
- [EXPR_LITERAL_INTEGER_HEXADECIMAL] = PREC_PRIMARY,
[EXPR_LITERAL_FLOATINGPOINT] = PREC_PRIMARY,
[EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL] = PREC_PRIMARY,
[EXPR_LITERAL_CHARACTER] = PREC_PRIMARY,
case EXPR_LITERAL_FLOATINGPOINT:
case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL:
case EXPR_LITERAL_INTEGER:
- case EXPR_LITERAL_INTEGER_HEXADECIMAL:
- case EXPR_LITERAL_INTEGER_OCTAL:
print_stringrep(&literal->value);
print_stringrep(&literal->suffix);
return;
static void create_integer_tarval(literal_expression_t *literal)
{
/* -1: signed only, 0: any, 1: unsigned only */
- int sign = literal->base.kind == EXPR_LITERAL_INTEGER ? -1 : 0;
+ int sign = literal->value.begin[0] != '0' /* decimal */ ? -1 : 0;
unsigned ls = 0;
const string_t *suffix = &literal->suffix;
/* parse suffix */
{
switch (literal->base.kind) {
case EXPR_LITERAL_INTEGER:
- case EXPR_LITERAL_INTEGER_OCTAL:
- case EXPR_LITERAL_INTEGER_HEXADECIMAL:
create_integer_tarval(literal);
return;
default:
}
case EXPR_LITERAL_INTEGER:
- case EXPR_LITERAL_INTEGER_OCTAL:
- case EXPR_LITERAL_INTEGER_HEXADECIMAL:
assert(literal->target_value != NULL);
tv = literal->target_value;
break;
EXPR_ENUM_CONSTANT,
EXPR_LITERAL_BOOLEAN,
EXPR_LITERAL_INTEGER,
- EXPR_LITERAL_INTEGER_OCTAL,
- EXPR_LITERAL_INTEGER_HEXADECIMAL,
EXPR_LITERAL_FLOATINGPOINT,
EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL,
EXPR_LITERAL_CHARACTER,
#define EXPR_LITERAL_CASES \
EXPR_LITERAL_BOOLEAN: \
case EXPR_LITERAL_INTEGER: \
- case EXPR_LITERAL_INTEGER_OCTAL: \
- case EXPR_LITERAL_INTEGER_HEXADECIMAL: \
case EXPR_LITERAL_FLOATINGPOINT: \
case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL: \
case EXPR_LITERAL_CHARACTER: \
[EXPR_ENUM_CONSTANT] = sizeof(reference_expression_t),
[EXPR_LITERAL_BOOLEAN] = sizeof(literal_expression_t),
[EXPR_LITERAL_INTEGER] = sizeof(literal_expression_t),
- [EXPR_LITERAL_INTEGER_OCTAL] = sizeof(literal_expression_t),
- [EXPR_LITERAL_INTEGER_HEXADECIMAL]= sizeof(literal_expression_t),
[EXPR_LITERAL_FLOATINGPOINT] = sizeof(literal_expression_t),
[EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL] = sizeof(literal_expression_t),
[EXPR_LITERAL_CHARACTER] = sizeof(literal_expression_t),
switch (token.kind) {
case T_INTEGER:
- kind = EXPR_LITERAL_INTEGER;
- check_integer_suffix();
- type = type_int;
- break;
case T_INTEGER_OCTAL:
- kind = EXPR_LITERAL_INTEGER_OCTAL;
- check_integer_suffix();
- type = type_int;
- break;
case T_INTEGER_HEXADECIMAL:
- kind = EXPR_LITERAL_INTEGER_HEXADECIMAL;
+ kind = EXPR_LITERAL_INTEGER;
check_integer_suffix();
type = type_int;
break;
+
case T_FLOATINGPOINT:
kind = EXPR_LITERAL_FLOATINGPOINT;
type = check_floatingpoint_suffix();
case EXPR_LITERAL_CHARACTER:
case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_LITERAL_INTEGER:
- case EXPR_LITERAL_INTEGER_OCTAL:
- case EXPR_LITERAL_INTEGER_HEXADECIMAL:
case EXPR_LITERAL_FLOATINGPOINT:
case EXPR_LITERAL_FLOATINGPOINT_HEXADECIMAL: return false;
case EXPR_STRING_LITERAL: return false;
/* TODO */
switch(expression->kind) {
case EXPR_LITERAL_INTEGER:
- case EXPR_LITERAL_INTEGER_HEXADECIMAL:
- case EXPR_LITERAL_INTEGER_OCTAL:
fprintf(out, "%s", expression->literal.value.begin);
break;