]> granicus.if.org Git - clang/commitdiff
PR35214: don't crash if we see an array of unknown bound added to an empty but invali...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 15 Nov 2017 03:03:56 +0000 (03:03 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 15 Nov 2017 03:03:56 +0000 (03:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@318258 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/Sema/const-eval.c

index c09c99386c36afc21d101e5ac0357fb4d4381202..e899b7ca164946ceedc202bd367aff1b344c9d8b 100644 (file)
@@ -1351,10 +1351,11 @@ namespace {
         Designator.setInvalid();
         return;
       }
-
-      assert(getType(Base)->isPointerType() || getType(Base)->isArrayType());
-      Designator.FirstEntryIsAnUnsizedArray = true;
-      Designator.addUnsizedArrayUnchecked(ElemTy);
+      if (checkSubobject(Info, E, CSK_ArrayToPointer)) {
+        assert(getType(Base)->isPointerType() || getType(Base)->isArrayType());
+        Designator.FirstEntryIsAnUnsizedArray = true;
+        Designator.addUnsizedArrayUnchecked(ElemTy);
+      }
     }
     void addArray(EvalInfo &Info, const Expr *E, const ConstantArrayType *CAT) {
       if (checkSubobject(Info, E, CSK_ArrayToPointer))
index 1b0a325dd1883f2610fb5ad1057c20a5ff6e2230..d60296f27992329c48cbbb35534d0ac1444bcf8d 100644 (file)
@@ -144,3 +144,11 @@ void *PR28739a = (__int128)(unsigned long)-1 + &PR28739a;
 void *PR28739b = &PR28739b + (__int128)(unsigned long)-1;
 __int128 PR28739c = (&PR28739c + (__int128)(unsigned long)-1) - &PR28739c;
 void *PR28739d = &(&PR28739d)[(__int128)(unsigned long)-1];
+
+struct PR35214_X {
+  int k;
+  int arr[];
+};
+int PR35214_x;
+int PR35214_y = ((struct PR35214_X *)&PR35214_x)->arr[1]; // expected-error {{not a compile-time constant}}
+int *PR35214_z = &((struct PR35214_X *)&PR35214_x)->arr[1]; // ok, &PR35214_x + 2