]> granicus.if.org Git - clang/commitdiff
Revert r72575, which isn't really right, and fix up other code to
authorEli Friedman <eli.friedman@gmail.com>
Fri, 29 May 2009 18:22:49 +0000 (18:22 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 29 May 2009 18:22:49 +0000 (18:22 +0000)
handle the construct in question correctly.

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

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

index 6090b79c5c1445dae5d2150f6b845386acc9023e..6608e120f3c67b33f8584ad5ae571848e52c4948 100644 (file)
@@ -31,6 +31,9 @@ static Expr *IsStringInit(Expr *Init, QualType DeclType, ASTContext &Context) {
   const ArrayType *AT = Context.getAsArrayType(DeclType);
   if (!AT) return 0;
 
+  if (!isa<ConstantArrayType>(AT) && !isa<IncompleteArrayType>(AT))
+    return 0;
+
   // See if this is a string literal or @encode.
   Init = Init->IgnoreParens();
   
@@ -97,22 +100,21 @@ static void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) {
     return;
   }
   
-  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);
-  }
+  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);
 }
 
 bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType,
@@ -670,10 +672,8 @@ void InitListChecker::CheckSubElementType(InitListExpr *IList,
       //   compatible structure or union type. In the latter case, the
       //   initial value of the object, including unnamed members, is
       //   that of the expression.
-      QualType ExprType = SemaRef.Context.getCanonicalType(expr->getType());
-      QualType ElemTypeCanon = SemaRef.Context.getCanonicalType(ElemType);
-      if (SemaRef.Context.typesAreCompatible(ExprType.getUnqualifiedType(),
-                                          ElemTypeCanon.getUnqualifiedType())) {
+      if (ElemType->isRecordType() &&
+          SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) {
         UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
         ++Index;
         return;
index 3e380c6d9509192732f1fac7989e08aec82504fb..70ba08b7eb0a8a973bec50a39b4fc068b692a346 100644 (file)
@@ -53,4 +53,4 @@ int pr2044b;
 int (*pr2044c(void))[pr2044b]; // expected-error {{variably modified type}}
 
 const int f5_ci = 1;
-void f5() { char a[][f5_ci] = {""}; }
+void f5() { char a[][f5_ci] = {""}; } // expected-error {{variable-sized object may not be initialized}}