remove more unnecessary XXX_INVALID constants
[cparser] / parser.c
index 0cc4257..082a6d0 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -93,7 +93,7 @@ static switch_statement_t  *current_switch    = NULL;
 static statement_t         *current_loop      = NULL;
 static statement_t         *current_parent    = NULL;
 static ms_try_statement_t  *current_try       = NULL;
-static linkage_kind_t       current_linkage   = LINKAGE_INVALID;
+static linkage_kind_t       current_linkage;
 static goto_statement_t    *goto_first        = NULL;
 static goto_statement_t   **goto_anchor       = NULL;
 static label_statement_t   *label_first       = NULL;
@@ -283,8 +283,8 @@ static void semantic_comparison(binary_expression_t *expression);
 static size_t get_statement_struct_size(statement_kind_t kind)
 {
        static const size_t sizes[] = {
-               [STATEMENT_INVALID]     = sizeof(invalid_statement_t),
-               [STATEMENT_EMPTY]       = sizeof(empty_statement_t),
+               [STATEMENT_ERROR]       = sizeof(statement_base_t),
+               [STATEMENT_EMPTY]       = sizeof(statement_base_t),
                [STATEMENT_COMPOUND]    = sizeof(compound_statement_t),
                [STATEMENT_RETURN]      = sizeof(return_statement_t),
                [STATEMENT_DECLARATION] = sizeof(declaration_statement_t),
@@ -316,7 +316,7 @@ static size_t get_statement_struct_size(statement_kind_t kind)
 static size_t get_expression_struct_size(expression_kind_t kind)
 {
        static const size_t sizes[] = {
-               [EXPR_INVALID]                    = sizeof(expression_base_t),
+               [EXPR_ERROR]                      = sizeof(expression_base_t),
                [EXPR_REFERENCE]                  = sizeof(reference_expression_t),
                [EXPR_REFERENCE_ENUM_VALUE]       = sizeof(reference_expression_t),
                [EXPR_LITERAL_BOOLEAN]            = sizeof(literal_expression_t),
@@ -397,17 +397,19 @@ static expression_t *allocate_expression_zero(expression_kind_t kind)
  * Creates a new invalid expression at the source position
  * of the current token.
  */
-static expression_t *create_invalid_expression(void)
+static expression_t *create_error_expression(void)
 {
-       return allocate_expression_zero(EXPR_INVALID);
+       expression_t *expression = allocate_expression_zero(EXPR_ERROR);
+       expression->base.type = type_error_type;
+       return expression;
 }
 
 /**
  * Creates a new invalid statement.
  */
-static statement_t *create_invalid_statement(void)
+static statement_t *create_error_statement(void)
 {
-       return allocate_statement_zero(STATEMENT_INVALID);
+       return allocate_statement_zero(STATEMENT_ERROR);
 }
 
 /**
@@ -705,7 +707,6 @@ static void scope_pop(scope_t *old_scope)
 static entity_t *get_entity(const symbol_t *const symbol,
                             namespace_tag_t namespc)
 {
-       assert(namespc != NAMESPACE_INVALID);
        entity_t *entity = symbol->entity;
        for (; entity != NULL; entity = entity->base.symbol_next) {
                if ((namespace_tag_t)entity->base.namespc == namespc)
@@ -738,7 +739,7 @@ static void stack_push(stack_entry_t **stack_ptr, entity_t *entity)
 {
        symbol_t           *symbol  = entity->base.symbol;
        entity_namespace_t  namespc = entity->base.namespc;
-       assert(namespc != NAMESPACE_INVALID);
+       assert(namespc != 0);
 
        /* replace/add entity into entity list of the symbol */
        entity_t **anchor;
@@ -1547,7 +1548,7 @@ unary:
                        return;
 
                EXPR_LITERAL_CASES
-               case EXPR_INVALID:
+               case EXPR_ERROR:
                case EXPR_STRING_LITERAL:
                case EXPR_WIDE_STRING_LITERAL:
                case EXPR_COMPOUND_LITERAL: // TODO init?
@@ -3335,8 +3336,7 @@ end_error:
 }
 
 typedef enum construct_type_kind_t {
-       CONSTRUCT_INVALID,
-       CONSTRUCT_POINTER,
+       CONSTRUCT_POINTER = 1,
        CONSTRUCT_REFERENCE,
        CONSTRUCT_FUNCTION,
        CONSTRUCT_ARRAY
@@ -3633,8 +3633,6 @@ static type_t *construct_declarator_type(construct_type_t *construct_list,
        for (; iter != NULL; iter = iter->base.next) {
                source_position_t const* const pos = &iter->base.pos;
                switch (iter->kind) {
-               case CONSTRUCT_INVALID:
-                       break;
                case CONSTRUCT_FUNCTION: {
                        construct_function_type_t *function      = &iter->function;
                        type_t                    *function_type = function->function_type;
@@ -4777,7 +4775,7 @@ static bool expression_returns(expression_t const *const expr)
                case EXPR_BUILTIN_CONSTANT_P:
                case EXPR_BUILTIN_TYPES_COMPATIBLE_P:
                case EXPR_OFFSETOF:
-               case EXPR_INVALID:
+               case EXPR_ERROR:
                        return true;
 
                case EXPR_STATEMENT: {
@@ -4871,7 +4869,7 @@ static void check_reachable(statement_t *const stmt)
        statement_t *last = stmt;
        statement_t *next;
        switch (stmt->kind) {
-               case STATEMENT_INVALID:
+               case STATEMENT_ERROR:
                case STATEMENT_EMPTY:
                case STATEMENT_ASM:
                        next = stmt->base.next;
@@ -5143,7 +5141,7 @@ found_break_parent:
                }
 
                switch (next->kind) {
-                       case STATEMENT_INVALID:
+                       case STATEMENT_ERROR:
                        case STATEMENT_EMPTY:
                        case STATEMENT_DECLARATION:
                        case STATEMENT_EXPRESSION:
@@ -5804,7 +5802,7 @@ static expression_t *expected_expression_error(void)
        }
        next_token();
 
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 static type_t *get_string_type(void)
@@ -6357,7 +6355,7 @@ static expression_t *parse_cast(void)
 
        return cast;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6572,14 +6570,14 @@ static expression_t *parse_offsetof(void)
        descend_into_subtype(&path);
 
        if (!walk_designator(&path, designator, true)) {
-               return create_invalid_expression();
+               return create_error_expression();
        }
 
        DEL_ARR_F(path.path);
 
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6615,7 +6613,7 @@ static expression_t *parse_va_start(void)
        }
        expect(')', end_error);
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6639,7 +6637,7 @@ static expression_t *parse_va_arg(void)
 
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6668,7 +6666,7 @@ static expression_t *parse_va_copy(void)
 
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6689,7 +6687,7 @@ static expression_t *parse_builtin_constant(void)
 
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6714,7 +6712,7 @@ static expression_t *parse_builtin_types_compatible(void)
 
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6771,7 +6769,7 @@ static expression_t *parse_compare_builtin(void)
 
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6792,7 +6790,7 @@ static expression_t *parse_assume(void)
        expression->base.type = type_void;
        return expression;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -6829,7 +6827,7 @@ static expression_t *parse_label_address(void)
        eat(T_ANDAND);
        if (token.kind != T_IDENTIFIER) {
                parse_error_expected("while parsing label address", T_IDENTIFIER, NULL);
-               return create_invalid_expression();
+               return create_error_expression();
        }
 
        label_t *const label = get_label();
@@ -6933,13 +6931,13 @@ static expression_t *parse_primary_expression(void)
                parse_declaration_specifiers(&specifiers);
                type_t const *const type = parse_abstract_declarator(specifiers.type);
                errorf(&pos, "encountered type '%T' while parsing expression", type);
-               return create_invalid_expression();
+               return create_error_expression();
        }
        }
 
        errorf(HERE, "unexpected token %K, expected an expression", &token);
        eat_until_anchor();
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 static expression_t *parse_array_expression(expression_t *left)
@@ -7093,7 +7091,7 @@ static expression_t *parse_select_expression(expression_t *addr)
 
        if (token.kind != T_IDENTIFIER) {
                parse_error_expected("while parsing select", T_IDENTIFIER, NULL);
-               return create_invalid_expression();
+               return create_error_expression();
        }
        symbol_t *symbol = token.identifier.symbol;
        next_token();
@@ -7127,14 +7125,14 @@ static expression_t *parse_select_expression(expression_t *addr)
                               "request for member '%Y' in something not a struct or union, but '%T'",
                               symbol, type_left);
                }
-               return create_invalid_expression();
+               return create_error_expression();
        }
 
        compound_t *compound = type_left->compound.compound;
        if (!compound->complete) {
                errorf(&pos, "request for member '%Y' in incomplete type '%T'",
                       symbol, type_left);
-               return create_invalid_expression();
+               return create_error_expression();
        }
 
        type_qualifiers_t  qualifiers = type_left->base.qualifiers;
@@ -7143,7 +7141,7 @@ static expression_t *parse_select_expression(expression_t *addr)
 
        if (result == NULL) {
                errorf(&pos, "'%T' has no member named '%Y'", orig_type, symbol);
-               return create_invalid_expression();
+               return create_error_expression();
        }
 
        return result;
@@ -7580,7 +7578,7 @@ static expression_t *parse_builtin_classify_type(void)
 
        return result;
 end_error:
-       return create_invalid_expression();
+       return create_error_expression();
 }
 
 /**
@@ -8523,7 +8521,7 @@ static void semantic_binexpr_assign(binary_expression_t *expression)
 static bool expression_has_effect(const expression_t *const expr)
 {
        switch (expr->kind) {
-               case EXPR_INVALID:                    return true; /* do NOT warn */
+               case EXPR_ERROR:                      return true; /* do NOT warn */
                case EXPR_REFERENCE:                  return false;
                case EXPR_REFERENCE_ENUM_VALUE:       return false;
                case EXPR_LABEL_ADDRESS:              return false;
@@ -9033,7 +9031,7 @@ end_of_asm:
 
        return statement;
 end_error:
-       return create_invalid_statement();
+       return create_error_statement();
 }
 
 static statement_t *parse_label_inner_statement(statement_t const *const label, char const *const label_kind)
@@ -9042,7 +9040,7 @@ static statement_t *parse_label_inner_statement(statement_t const *const label,
        switch (token.kind) {
                case '}':
                        errorf(&label->base.source_position, "%s at end of compound statement", label_kind);
-                       inner_stmt = create_invalid_statement();
+                       inner_stmt = create_error_statement();
                        break;
 
                case ';':
@@ -9382,7 +9380,7 @@ static statement_t *parse_switch(void)
        return statement;
 end_error:
        POP_PARENT();
-       return create_invalid_statement();
+       return create_error_statement();
 }
 
 static statement_t *parse_loop_body(statement_t *const loop)
@@ -9424,7 +9422,7 @@ static statement_t *parse_while(void)
        return statement;
 end_error:
        POP_PARENT();
-       return create_invalid_statement();
+       return create_error_statement();
 }
 
 /**
@@ -9459,7 +9457,7 @@ static statement_t *parse_do(void)
        return statement;
 end_error:
        POP_PARENT();
-       return create_invalid_statement();
+       return create_error_statement();
 }
 
 /**
@@ -9530,7 +9528,7 @@ end_error2:
        /* fallthrough */
 
 end_error1:
-       return create_invalid_statement();
+       return create_error_statement();
 }
 
 /**
@@ -9570,7 +9568,7 @@ static statement_t *parse_goto(void)
                else
                        parse_error_expected("while parsing goto", T_IDENTIFIER, NULL);
                eat_until_anchor();
-               return create_invalid_statement();
+               return create_error_statement();
        }
 
        /* remember the goto's in a list for later checking */
@@ -9838,11 +9836,11 @@ static statement_t *parse_ms_try_statment(void)
                statement->ms_try.final_statement = parse_compound_statement(false);
        } else {
                parse_error_expected("while parsing __try statement", T___except, T___finally, NULL);
-               return create_invalid_statement();
+               return create_error_statement();
        }
        return statement;
 end_error:
-       return create_invalid_statement();
+       return create_error_statement();
 }
 
 static statement_t *parse_empty_statement(void)
@@ -10025,7 +10023,7 @@ static statement_t *intern_parse_statement(void)
 
        default:
                errorf(HERE, "unexpected token %K while parsing statement", &token);
-               statement = create_invalid_statement();
+               statement = create_error_statement();
                if (!at_anchor())
                        next_token();
                break;
@@ -10168,7 +10166,7 @@ static statement_t *parse_compound_statement(bool inside_expression_statement)
                        break;
                }
                statement_t *sub_statement = intern_parse_statement();
-               if (is_invalid_statement(sub_statement)) {
+               if (sub_statement->kind == STATEMENT_ERROR) {
                        /* an error occurred. if we are at an anchor, return */
                        if (at_anchor())
                                goto end_error;
@@ -10373,7 +10371,7 @@ static void parse_linkage_specification(void)
                new_linkage = LINKAGE_CXX;
        } else {
                errorf(&pos, "linkage string \"%s\" not recognized", linkage);
-               new_linkage = LINKAGE_INVALID;
+               new_linkage = LINKAGE_C;
        }
        current_linkage = new_linkage;
 
@@ -10420,7 +10418,7 @@ static void parse_external(void)
 
                case ';':
                        if (!strict_mode) {
-                               warningf(WARN_OTHER, HERE, "stray ';' outside of function");
+                               warningf(WARN_STRAY_SEMICOLON, HERE, "stray ';' outside of function");
                                next_token();
                                return;
                        }