aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaInit.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-05-29 18:22:49 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-05-29 18:22:49 +0000
commit8718a6a02ccc53fea758677781a8df3a8b0c41c9 (patch)
treebb36092fa0da312dc37ec9575d38d39df358c112 /lib/Sema/SemaInit.cpp
parentef65f06e8e440aec541442cfd73a8a836e9bc842 (diff)
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
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r--lib/Sema/SemaInit.cpp40
1 files changed, 20 insertions, 20 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<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;