From 8718a6a02ccc53fea758677781a8df3a8b0c41c9 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Fri, 29 May 2009 18:22:49 +0000 Subject: [PATCH] Revert r72575, which isn't really right, and fix up other code to 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 | 40 ++++++++++++++++++++-------------------- test/Sema/vla.c | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 6090b79c5c..6608e120f3 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -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(AT) && !isa(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(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(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; diff --git a/test/Sema/vla.c b/test/Sema/vla.c index 3e380c6d95..70ba08b7eb 100644 --- a/test/Sema/vla.c +++ b/test/Sema/vla.c @@ -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}} -- 2.40.0