- source_position_t begin = *HERE;
- string_t res = token.string.string;
- bool is_wide = (token.kind == T_WIDE_STRING_LITERAL);
-
- next_token();
- while (token.kind == T_STRING_LITERAL
- || token.kind == T_WIDE_STRING_LITERAL) {
- warn_string_concat(HERE);
- res = concat_strings(&res, &token.string.string);
- next_token();
- is_wide |= token.kind == T_WIDE_STRING_LITERAL;
- }
-
- expression_t *literal;
- if (is_wide) {
- literal = allocate_expression_zero(EXPR_WIDE_STRING_LITERAL);
- literal->base.type = get_wide_string_type();
- } else {
- literal = allocate_expression_zero(EXPR_STRING_LITERAL);
- literal->base.type = get_string_type();
- }
- literal->base.source_position = begin;
- literal->literal.value = res;
-
- return literal;
+ expression_t *const expr = allocate_expression_zero(EXPR_STRING_LITERAL);
+ expr->string_literal.value = concat_string_literals(&expr->string_literal.encoding);
+ expr->base.type = get_string_type(expr->string_literal.encoding);
+ return expr;