]> granicus.if.org Git - clang/commitdiff
Avoid dumping during semantic analysis when checking array types when
authorMike Stump <mrs@apple.com>
Fri, 29 May 2009 16:34:15 +0000 (16:34 +0000)
committerMike Stump <mrs@apple.com>
Fri, 29 May 2009 16:34:15 +0000 (16:34 +0000)
a vla is used.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72575 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/Sema/vla.c

index 5dc40a4593445996bf47976c6d23520e402afeec..6090b79c5c1445dae5d2150f6b845386acc9023e 100644 (file)
@@ -97,21 +97,22 @@ static void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) {
     return;
   }
   
-  const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
-  
-  // C99 6.7.8p14. We have an array of character type with known size.  However,
-  // the size may be smaller or larger than the string we are initializing.
-  // FIXME: Avoid truncation for 64-bit length strings.
-  if (StrLength-1 > CAT->getSize().getZExtValue())
-    S.Diag(Str->getSourceRange().getBegin(),
-           diag::warn_initializer_string_for_char_array_too_long)
-      << Str->getSourceRange();
-  
-  // Set the type to the actual size that we are initializing.  If we have
-  // something like:
-  //   char x[1] = "foo";
-  // then this will set the string literal's type to char[1].
-  Str->setType(DeclT);
+  if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
+    // C99 6.7.8p14. We have an array of character type with known size.
+    // However, the size may be smaller or larger than the string we are
+    // initializing.
+    // FIXME: Avoid truncation for 64-bit length strings.
+    if (StrLength-1 > CAT->getSize().getZExtValue())
+      S.Diag(Str->getSourceRange().getBegin(),
+             diag::warn_initializer_string_for_char_array_too_long)
+        << Str->getSourceRange();
+
+    // Set the type to the actual size that we are initializing.  If we have
+    // something like:
+    //   char x[1] = "foo";
+    // then this will set the string literal's type to char[1].
+    Str->setType(DeclT);
+  }
 }
 
 bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType,
index 674547297a2fec7be40e07e0dd673921390b8470..3e380c6d9509192732f1fac7989e08aec82504fb 100644 (file)
@@ -51,3 +51,6 @@ int f4(int a[*][*]);
 int pr2044(int b) {int (*c(void))[b];**c() = 2;} // expected-error {{variably modified type}}
 int pr2044b;
 int (*pr2044c(void))[pr2044b]; // expected-error {{variably modified type}}
+
+const int f5_ci = 1;
+void f5() { char a[][f5_ci] = {""}; }