Store the whole second argument expression of __builtin_va_start(), not just a variab...
authorChristoph Mallon <christoph.mallon@gmx.de>
Thu, 17 May 2012 13:57:00 +0000 (15:57 +0200)
committerChristoph Mallon <christoph.mallon@gmx.de>
Sat, 19 May 2012 08:10:36 +0000 (10:10 +0200)
ast.c
ast_t.h
parser.c

diff --git a/ast.c b/ast.c
index 9617b1f..c0e6b1d 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -538,7 +538,7 @@ static void print_va_start(const va_start_expression_t *const expression)
        print_string("__builtin_va_start(");
        print_assignment_expression(expression->ap);
        print_string(", ");
-       print_string(expression->parameter->base.base.symbol->string);
+       print_assignment_expression(expression->parameter);
        print_char(')');
 }
 
diff --git a/ast_t.h b/ast_t.h
index 58d6750..6013b12 100644 (file)
--- a/ast_t.h
+++ b/ast_t.h
@@ -359,7 +359,7 @@ struct offsetof_expression_t {
 struct va_start_expression_t {
        expression_base_t  base;
        expression_t      *ap;
-       variable_t        *parameter;
+       expression_t      *parameter;
 };
 
 struct va_arg_expression_t {
index 09b3cea..0695e71 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -6431,6 +6431,7 @@ static expression_t *parse_va_start(void)
        rem_anchor_token(',');
        expect(',');
        expression_t *const param = parse_assignment_expression();
+       expression->va_starte.parameter = param;
        rem_anchor_token(')');
        expect(')');
 
@@ -6444,8 +6445,6 @@ static expression_t *parse_va_start(void)
                                entity->kind != ENTITY_PARAMETER) {
                        errorf(&param->base.source_position,
                               "second argument of 'va_start' must be last parameter of the current function");
-               } else {
-                       expression->va_starte.parameter = &entity->variable;
                }
        } else {
                expression = create_error_expression();