sizeof from vla type is not constant
authorMatthias Braun <matze@braunis.de>
Tue, 2 Sep 2008 08:17:21 +0000 (08:17 +0000)
committerMatthias Braun <matze@braunis.de>
Tue, 2 Sep 2008 08:17:21 +0000 (08:17 +0000)
[r21633]

ast.c

diff --git a/ast.c b/ast.c
index 1905759..1dd6085 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -1639,7 +1639,6 @@ bool is_constant_expression(const expression_t *expression)
        case EXPR_WIDE_CHARACTER_CONSTANT:
        case EXPR_STRING_LITERAL:
        case EXPR_WIDE_STRING_LITERAL:
-       case EXPR_SIZEOF:
        case EXPR_CLASSIFY_TYPE:
        case EXPR_FUNCNAME:
        case EXPR_OFFSETOF:
@@ -1647,6 +1646,17 @@ bool is_constant_expression(const expression_t *expression)
        case EXPR_BUILTIN_CONSTANT_P:
                return true;
 
+       case EXPR_SIZEOF: {
+               type_t *type = expression->typeprop.type;
+               if (type == NULL)
+                       type = expression->typeprop.tp_expression->base.type;
+
+               type = skip_typeref(type);
+               if (is_type_array(type) && type->array.is_vla)
+                       return false;
+               return true;
+       }
+
        case EXPR_BUILTIN_SYMBOL:
        case EXPR_BUILTIN_PREFETCH:
        case EXPR_SELECT: