ast2firm: Factorise code to convert a value to its storage type.
[cparser] / walk.c
diff --git a/walk.c b/walk.c
index 4ed3156..96a722b 100644 (file)
--- a/walk.c
+++ b/walk.c
@@ -82,10 +82,8 @@ static void walk_type(type_t *const type, const walk_env_t *const env)
        case TYPE_ENUM:
                walk_entity((entity_t*)type->enumt.enume, env);
                return;
-       case TYPE_INVALID:
-               break;
        }
-       panic("invalid type found");
+       panic("invalid type");
 }
 
 static void walk_expression(expression_t *const expr,
@@ -98,16 +96,16 @@ static void walk_expression(expression_t *const expr,
                walk_statement(expr->statement.statement, env);
                return;
 
-       EXPR_BINARY_CASES
+       case EXPR_BINARY_CASES:
                walk_expression(expr->binary.left, env);
                walk_expression(expr->binary.right, env);
                return;
 
-       EXPR_UNARY_CASES_OPTIONAL
+       case EXPR_UNARY_CASES_OPTIONAL:
                if (expr->unary.value == NULL)
                        return;
                /* FALLTHROUGH */
-       EXPR_UNARY_CASES_MANDATORY
+       case EXPR_UNARY_CASES_MANDATORY:
                walk_expression(expr->unary.value, env);
                return;
 
@@ -178,16 +176,15 @@ static void walk_expression(expression_t *const expr,
                walk_designator(expr->offsetofe.designator, env);
                return;
 
-       EXPR_LITERAL_CASES
+       case EXPR_LITERAL_CASES:
+       case EXPR_LITERAL_CHARACTER:
        case EXPR_REFERENCE:
-       case EXPR_REFERENCE_ENUM_VALUE:
+       case EXPR_ENUM_CONSTANT:
        case EXPR_STRING_LITERAL:
-       case EXPR_WIDE_STRING_LITERAL:
        case EXPR_FUNCNAME:
        case EXPR_LABEL_ADDRESS:
+       case EXPR_ERROR:
                return;
-       case EXPR_INVALID:
-               break;
        }
        panic("invalid expr kind");
 }
@@ -217,8 +214,8 @@ static void walk_initializer(const initializer_t  *initializer,
        case INITIALIZER_DESIGNATOR:
                walk_designator(initializer->designator.designator, env);
                return;
+
        case INITIALIZER_STRING:
-       case INITIALIZER_WIDE_STRING:
                return;
        }
 }
@@ -246,8 +243,8 @@ static void walk_entity(entity_t *entity, const walk_env_t *const env)
                return;
        case ENTITY_FUNCTION:
                walk_type(entity->declaration.type, env);
-               if (entity->function.statement != NULL)
-                       walk_statement(entity->function.statement, env);
+               if (entity->function.body != NULL)
+                       walk_statement(entity->function.body, env);
                return;
        case ENTITY_COMPOUND_MEMBER:
        case ENTITY_PARAMETER:
@@ -271,10 +268,8 @@ static void walk_entity(entity_t *entity, const walk_env_t *const env)
        case ENTITY_LABEL:
        case ENTITY_LOCAL_LABEL:
                return;
-       case ENTITY_INVALID:
-               break;
        }
-       panic("invalid entity found");
+       panic("invalid entity");
 }
 
 static void walk_declarations(entity_t*            entity,
@@ -332,14 +327,14 @@ static void walk_statement(statement_t *const stmt, const walk_env_t *const env)
                return;
 
        case STATEMENT_CASE_LABEL:
+               if (stmt->case_label.expression) {
+                       walk_expression(stmt->case_label.expression, env);
+                       if (stmt->case_label.end_range)
+                               walk_expression(stmt->case_label.end_range, env);
+               }
                walk_statement(stmt->case_label.statement, env);
                return;
 
-       case STATEMENT_WHILE:
-               walk_expression(stmt->whiles.condition, env);
-               walk_statement(stmt->whiles.body, env);
-               return;
-
        case STATEMENT_DO_WHILE:
                walk_statement(stmt->do_while.body, env);
                walk_expression(stmt->do_while.condition, env);
@@ -364,12 +359,16 @@ static void walk_statement(statement_t *const stmt, const walk_env_t *const env)
                walk_statement(stmt->ms_try.final_statement, env);
                return;
 
-       case STATEMENT_INVALID:
+       case STATEMENT_COMPUTED_GOTO:
+               walk_expression(stmt->computed_goto.expression, env);
+               return;
+
+       case STATEMENT_ERROR:
        case STATEMENT_EMPTY:
        case STATEMENT_CONTINUE:
        case STATEMENT_BREAK:
-       case STATEMENT_GOTO:
        case STATEMENT_ASM:
+       case STATEMENT_GOTO:
        case STATEMENT_LEAVE:
                return;
        }