type: Add missing space for printing complex types.
[cparser] / ast.c
diff --git a/ast.c b/ast.c
index 99f1993..d08da8c 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -1007,8 +1007,8 @@ static void print_for_statement(const for_statement_t *statement)
  */
 static void print_asm_arguments(asm_argument_t const *const arguments)
 {
-       print_string(" : ");
-       separator_t sep = { "", ", " };
+       print_string(" :");
+       separator_t sep = { " ", ", " };
        for (asm_argument_t const *i = arguments; i; i = i->next) {
                print_string(sep_next(&sep));
                if (i->symbol)
@@ -1027,14 +1027,24 @@ static void print_asm_arguments(asm_argument_t const *const arguments)
  */
 static void print_asm_clobbers(asm_clobber_t const *const clobbers)
 {
-       print_string(" : ");
-       separator_t sep = { "", ", " };
+       print_string(" :");
+       separator_t sep = { " ", ", " };
        for (asm_clobber_t const *i = clobbers; i; i = i->next) {
                print_string(sep_next(&sep));
                print_quoted_string(&i->clobber, '"');
        }
 }
 
+static void print_asm_labels(asm_label_t const *const labels)
+{
+       print_string(" :");
+       separator_t sep = { " ", ", " };
+       for (asm_label_t const *i = labels; i; i = i->next) {
+               print_string(sep_next(&sep));
+               print_string(i->label->base.symbol->string);
+       }
+}
+
 /**
  * Print an assembler statement.
  *
@@ -1042,12 +1052,14 @@ static void print_asm_clobbers(asm_clobber_t const *const clobbers)
  */
 static void print_asm_statement(asm_statement_t const *const stmt)
 {
-       print_string("asm ");
-       if (stmt->is_volatile) print_string("volatile ");
+       print_string("asm");
+       if (stmt->is_volatile) print_string(" volatile");
+       if (stmt->labels)      print_string(" goto");
        print_char('(');
        print_quoted_string(&stmt->asm_text, '"');
 
        unsigned const n =
+               stmt->labels   ? 4 :
                stmt->clobbers ? 3 :
                stmt->inputs   ? 2 :
                stmt->outputs  ? 1 :
@@ -1055,6 +1067,7 @@ static void print_asm_statement(asm_statement_t const *const stmt)
        if (n >= 1) print_asm_arguments(stmt->outputs);
        if (n >= 2) print_asm_arguments(stmt->inputs);
        if (n >= 3) print_asm_clobbers( stmt->clobbers);
+       if (n >= 4) print_asm_labels(   stmt->labels);
 
        print_string(");");
 }
@@ -1485,6 +1498,14 @@ static expression_classification_t is_object_with_linker_constant_address(
        case EXPR_UNARY_DEREFERENCE:
                return is_linker_constant(expression->unary.value);
 
+       case EXPR_COMPOUND_LITERAL: {
+               const compound_literal_expression_t *literal
+                       = &expression->compound_literal;
+               return literal->global_scope ||
+                      ((literal->type->base.qualifiers & TYPE_QUALIFIER_CONST)
+                       && is_constant_initializer(literal->initializer));
+       }
+
        case EXPR_SELECT: {
                type_t *base_type = skip_typeref(expression->select.compound->base.type);
                if (is_type_pointer(base_type)) {