X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast.c;h=ac0ac87e5d9aff62f3d70b405c650b73ba1f8990;hb=296ba6e16420b89723d1a5b1217d6ecfc2fb0c7d;hp=e3e4bea0459a309d2cd3b436cf38146f2d140134;hpb=99f5a3cd09e0d7d6127751fc9f6550b5dcbbbd33;p=cparser diff --git a/ast.c b/ast.c index e3e4bea..ac0ac87 100644 --- a/ast.c +++ b/ast.c @@ -67,13 +67,6 @@ void print_indent(void) print_char('\t'); } -static void print_stringrep(const string_t *string) -{ - for (size_t i = 0; i < string->size; ++i) { - print_char(string->begin[i]); - } -} - /** * Returns 1 if a given precedence level has right-to-left * associativity, else 0. @@ -197,6 +190,8 @@ static unsigned get_expression_precedence(expression_kind_t kind) */ static void print_quoted_string(const string_t *const string, char border) { + print_string(get_string_encoding_prefix(string->encoding)); + print_char(border); const char *end = string->begin + string->size; for (const char *c = string->begin; c != end; ++c) { @@ -233,7 +228,6 @@ static void print_quoted_string(const string_t *const string, char border) 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, delimiter); } @@ -247,8 +241,7 @@ static void print_literal(const literal_expression_t *literal) case EXPR_LITERAL_BOOLEAN: case EXPR_LITERAL_FLOATINGPOINT: case EXPR_LITERAL_INTEGER: - print_stringrep(&literal->value); - print_stringrep(&literal->suffix); + print_string(literal->value.begin); return; default: @@ -455,8 +448,8 @@ static void print_array_expression(const array_access_expression_t *expression) static void print_typeprop_expression(const typeprop_expression_t *expression) { switch (expression->base.kind) { - case EXPR_SIZEOF: print_string("sizeof"); break; - case EXPR_ALIGNOF: print_string("__alignof__"); break; + case EXPR_SIZEOF: print_string("sizeof"); break; + case EXPR_ALIGNOF: print_string(c_mode & _C11 ? "_Alignof" : "__alignof__"); break; default: panic("invalid typeprop kind"); } if (expression->tp_expression != NULL) { @@ -954,19 +947,6 @@ static void print_declaration_statement( } } -/** - * Print a while statement. - * - * @param statement the statement - */ -static void print_while_statement(const while_statement_t *statement) -{ - print_string("while ("); - print_expression(statement->condition); - print_char(')'); - print_inner_statement(statement->body); -} - /** * Print a do-while statement. * @@ -989,28 +969,33 @@ static void print_do_while_statement(const do_while_statement_t *statement) */ static void print_for_statement(const for_statement_t *statement) { - print_string("for ("); - if (statement->initialisation != NULL) { - print_expression(statement->initialisation); + if (statement->initialisation || statement->scope.entities || !statement->condition || statement->step) { + print_string("for ("); + if (statement->initialisation != NULL) { + print_expression(statement->initialisation); + print_char(';'); + } else { + entity_t const *entity = statement->scope.entities; + for (; entity != NULL; entity = entity->base.next) { + if (is_generated_entity(entity)) + continue; + /* FIXME display of multiple declarations is wrong */ + print_declaration(entity); + } + } + if (statement->condition != NULL) { + print_char(' '); + print_expression(statement->condition); + } print_char(';'); - } else { - entity_t const *entity = statement->scope.entities; - for (; entity != NULL; entity = entity->base.next) { - if (is_generated_entity(entity)) - continue; - /* FIXME display of multiple declarations is wrong */ - print_declaration(entity); + if (statement->step != NULL) { + print_char(' '); + print_expression(statement->step); } - } - if (statement->condition != NULL) { - print_char(' '); + } else { + print_string("while ("); print_expression(statement->condition); } - print_char(';'); - if (statement->step != NULL) { - print_char(' '); - print_expression(statement->step); - } print_char(')'); print_inner_statement(statement->body); } @@ -1146,7 +1131,6 @@ void print_statement(statement_t const *const stmt) case STATEMENT_MS_TRY: print_ms_try_statement( &stmt->ms_try); break; case STATEMENT_RETURN: print_return_statement( &stmt->returns); break; case STATEMENT_SWITCH: print_switch_statement( &stmt->switchs); break; - case STATEMENT_WHILE: print_while_statement( &stmt->whiles); break; } } @@ -1181,11 +1165,11 @@ void print_initializer(const initializer_t *initializer) } switch (initializer->kind) { - case INITIALIZER_VALUE: { - const initializer_value_t *value = &initializer->value; - print_assignment_expression(value->value); + case INITIALIZER_STRING: + case INITIALIZER_VALUE: + print_assignment_expression(initializer->value.value); return; - } + case INITIALIZER_LIST: { print_string("{ "); const initializer_list_t *list = &initializer->list; @@ -1202,10 +1186,6 @@ void print_initializer(const initializer_t *initializer) return; } - case INITIALIZER_STRING: - print_string_literal(get_init_string(initializer), '"'); - return; - case INITIALIZER_DESIGNATOR: print_designator(initializer->designator.designator); print_string(" = "); @@ -1364,9 +1344,9 @@ void print_declaration(const entity_t *entity) print_type_ext(entity->declaration.type, entity->base.symbol, &entity->function.parameters); - if (entity->function.statement != NULL) { + if (entity->function.body != NULL) { print_char('\n'); - print_indented_statement(entity->function.statement); + print_indented_statement(entity->function.body); print_char('\n'); return; } @@ -1374,7 +1354,7 @@ void print_declaration(const entity_t *entity) case ENTITY_VARIABLE: if (entity->variable.thread_local) - print_string("__thread "); + print_string(c_mode & _C11 ? "_Thread_local " : "__thread "); print_type_ext(declaration->type, declaration->base.symbol, NULL); if (entity->variable.initializer != NULL) { print_string(" = "); @@ -1772,21 +1752,45 @@ static expression_classification_t is_object_with_constant_address(const express expression_classification_t is_constant_expression(const expression_t *expression) { switch (expression->kind) { - case EXPR_LITERAL_CASES: case EXPR_LITERAL_CHARACTER: - case EXPR_CLASSIFY_TYPE: - case EXPR_OFFSETOF: - case EXPR_ALIGNOF: - case EXPR_BUILTIN_CONSTANT_P: case EXPR_BUILTIN_TYPES_COMPATIBLE_P: case EXPR_ENUM_CONSTANT: + case EXPR_LITERAL_BOOLEAN: + case EXPR_LITERAL_MS_NOOP: return EXPR_CLASS_CONSTANT; - case EXPR_SIZEOF: { - type_t *const type = skip_typeref(expression->typeprop.type); - return - !is_type_array(type) || !type->array.is_vla ? EXPR_CLASS_CONSTANT : - EXPR_CLASS_VARIABLE; + { + type_t *type; + case EXPR_ALIGNOF: + type = skip_typeref(expression->typeprop.type); + goto check_type; + + case EXPR_CLASSIFY_TYPE: + type = skip_typeref(expression->classify_type.type_expression->base.type); + goto check_type; + + case EXPR_LITERAL_INTEGER: + case EXPR_LITERAL_FLOATINGPOINT: + type = skip_typeref(expression->base.type); + goto check_type; + + case EXPR_OFFSETOF: + type = skip_typeref(expression->offsetofe.type); + goto check_type; + + case EXPR_SIZEOF: + type = skip_typeref(expression->typeprop.type); + if (is_type_array(type) && type->array.is_vla) + return EXPR_CLASS_VARIABLE; + goto check_type; + +check_type: + return is_type_valid(type) ? EXPR_CLASS_CONSTANT : EXPR_CLASS_ERROR; + } + + case EXPR_BUILTIN_CONSTANT_P: { + expression_classification_t const c = is_constant_expression(expression->builtin_constant.value); + return c != EXPR_CLASS_ERROR ? EXPR_CLASS_CONSTANT : EXPR_CLASS_ERROR; } case EXPR_STRING_LITERAL: