[EXPR_LITERAL_INTEGER] = PREC_PRIMARY,
[EXPR_LITERAL_FLOATINGPOINT] = PREC_PRIMARY,
[EXPR_LITERAL_CHARACTER] = PREC_PRIMARY,
- [EXPR_LITERAL_WIDE_CHARACTER] = PREC_PRIMARY,
[EXPR_LITERAL_MS_NOOP] = PREC_PRIMARY,
[EXPR_STRING_LITERAL] = PREC_PRIMARY,
[EXPR_COMPOUND_LITERAL] = PREC_UNARY,
print_char(border);
}
-static void print_char_literal(string_literal_expression_t const *const literal)
-{
- if (literal->base.kind == EXPR_LITERAL_WIDE_CHARACTER)
- print_char('L');
- print_quoted_string(&literal->value, '\'');
-}
-
-static void print_string_literal(const string_literal_expression_t *literal)
+static void print_string_literal(string_literal_expression_t const *const literal, char const delimiter)
{
print_string(get_string_encoding_prefix(literal->encoding));
- print_quoted_string(&literal->value, '"');
+ print_quoted_string(&literal->value, delimiter);
}
static void print_literal(const literal_expression_t *literal)
case EXPR_FUNCNAME:
case EXPR_LITERAL_CASES:
case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_REFERENCE:
case EXPR_STRING_LITERAL:
/* Do not print () around subexpressions consisting of a single token. */
case EXPR_FUNCNAME: print_funcname( &expr->funcname); break;
case EXPR_LABEL_ADDRESS: print_label_address_expression(&expr->label_address); break;
case EXPR_LITERAL_CASES: print_literal( &expr->literal); break;
- case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER: print_char_literal( &expr->string_literal); break;
+ case EXPR_LITERAL_CHARACTER: print_string_literal( &expr->string_literal, '\''); break;
case EXPR_OFFSETOF: print_offsetof_expression( &expr->offsetofe); break;
case EXPR_REFERENCE:
case EXPR_ENUM_CONSTANT: print_reference_expression( &expr->reference); break;
case EXPR_SELECT: print_select( &expr->select); break;
case EXPR_STATEMENT: print_statement_expression( &expr->statement); break;
- case EXPR_STRING_LITERAL: print_string_literal( &expr->string_literal); break;
+ case EXPR_STRING_LITERAL: print_string_literal( &expr->string_literal, '"'); break;
case EXPR_UNARY_CASES: print_unary_expression( &expr->unary); break;
case EXPR_VA_ARG: print_va_arg( &expr->va_arge); break;
case EXPR_VA_COPY: print_va_copy( &expr->va_copye); break;
switch (expression->kind) {
case EXPR_LITERAL_CASES:
case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_CLASSIFY_TYPE:
case EXPR_OFFSETOF:
case EXPR_ALIGNOF:
size_t size = literal->value.size;
ir_tarval *tv;
- switch (literal->base.kind) {
- case EXPR_LITERAL_WIDE_CHARACTER: {
+ switch (literal->encoding) {
+ case STRING_ENCODING_WIDE: {
utf32 v = read_utf8_char(&string);
char buf[128];
size_t len = snprintf(buf, sizeof(buf), UTF32_PRINTF_FORMAT, v);
break;
}
- case EXPR_LITERAL_CHARACTER: {
+ case STRING_ENCODING_CHAR: {
long long int v;
bool char_is_signed
= get_atomic_type_flags(ATOMIC_TYPE_CHAR) & ATOMIC_TYPE_FLAG_SIGNED;
case EXPR_FUNCNAME: return function_name_to_firm( &expr->funcname);
case EXPR_LABEL_ADDRESS: return label_address_to_firm( &expr->label_address);
case EXPR_LITERAL_CASES: return literal_to_firm( &expr->literal);
- case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER: return char_literal_to_firm( &expr->string_literal);
+ case EXPR_LITERAL_CHARACTER: return char_literal_to_firm( &expr->string_literal);
case EXPR_OFFSETOF: return offsetof_to_firm( &expr->offsetofe);
case EXPR_REFERENCE: return reference_expression_to_firm( &expr->reference);
case EXPR_ENUM_CONSTANT: return enum_constant_to_firm( &expr->reference);
EXPR_LITERAL_INTEGER,
EXPR_LITERAL_FLOATINGPOINT,
EXPR_LITERAL_CHARACTER,
- EXPR_LITERAL_WIDE_CHARACTER,
EXPR_LITERAL_MS_NOOP, /**< MS __noop extension */
EXPR_STRING_LITERAL,
EXPR_COMPOUND_LITERAL,
[EXPR_LITERAL_INTEGER] = sizeof(literal_expression_t),
[EXPR_LITERAL_FLOATINGPOINT] = sizeof(literal_expression_t),
[EXPR_LITERAL_CHARACTER] = sizeof(string_literal_expression_t),
- [EXPR_LITERAL_WIDE_CHARACTER] = sizeof(string_literal_expression_t),
[EXPR_STRING_LITERAL] = sizeof(string_literal_expression_t),
[EXPR_COMPOUND_LITERAL] = sizeof(compound_literal_expression_t),
[EXPR_CALL] = sizeof(call_expression_t),
case EXPR_LITERAL_CASES:
case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_ERROR:
case EXPR_STRING_LITERAL:
case EXPR_COMPOUND_LITERAL: // TODO init?
case EXPR_ENUM_CONSTANT:
case EXPR_LITERAL_CASES:
case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_STRING_LITERAL:
case EXPR_COMPOUND_LITERAL: // TODO descend into initialisers
case EXPR_LABEL_ADDRESS:
*/
static expression_t *parse_character_constant(void)
{
- expression_t *literal;
- switch (token.string.encoding) {
- case STRING_ENCODING_CHAR: {
- literal = allocate_expression_zero(EXPR_LITERAL_CHARACTER);
- literal->base.type = c_mode & _CXX ? type_char : type_int;
- literal->string_literal.value = token.string.string;
+ expression_t *const literal = allocate_expression_zero(EXPR_LITERAL_CHARACTER);
+ literal->string_literal.encoding = token.string.encoding;
+ literal->string_literal.value = token.string.string;
+ switch (token.string.encoding) {
+ case STRING_ENCODING_CHAR:
+ literal->base.type = c_mode & _CXX ? type_char : type_int;
if (literal->string_literal.value.size > 1) {
if (!GNU_MODE && !(c_mode & _C99)) {
errorf(HERE, "more than 1 character in character constant");
}
}
break;
- }
-
- case STRING_ENCODING_WIDE: {
- literal = allocate_expression_zero(EXPR_LITERAL_WIDE_CHARACTER);
- literal->base.type = type_int;
- literal->string_literal.value = token.string.string;
+ case STRING_ENCODING_WIDE:
+ literal->base.type = type_int;
if (wstrlen(&literal->string_literal.value) > 1) {
warningf(WARN_MULTICHAR, HERE, "multi-character character constant");
}
break;
}
- }
eat(T_CHARACTER_CONSTANT);
return literal;
case EXPR_LITERAL_MS_NOOP: return true;
case EXPR_LITERAL_BOOLEAN:
case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_LITERAL_INTEGER:
case EXPR_LITERAL_FLOATINGPOINT:
case EXPR_STRING_LITERAL: return false;
case EXPR_LITERAL_CASES:
case EXPR_LITERAL_CHARACTER:
- case EXPR_LITERAL_WIDE_CHARACTER:
case EXPR_REFERENCE:
case EXPR_ENUM_CONSTANT:
case EXPR_STRING_LITERAL: