diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-02-23 02:25:10 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-02-23 02:25:10 +0000 |
commit | 91f5ae5022c75fb35b77aeffd5dac4163f456ee8 (patch) | |
tree | 5dca72db2f094bed82024e6c9eee1e3eec45ae62 /clang/lib/Sema | |
parent | d675a4cec09cf84b2fae69011bba05287e0d27b9 (diff) | |
download | bcm5719-llvm-91f5ae5022c75fb35b77aeffd5dac4163f456ee8.tar.gz bcm5719-llvm-91f5ae5022c75fb35b77aeffd5dac4163f456ee8.zip |
Try to handle qualifiers more consistently for array InitListExprs. Fixes <rdar://problem/10907510>, and makes the ASTs a bit more self-consistent.
(I've chosen to keep the qualifiers, but it isn't a strong preference; if anyone prefers removing them, please yell.)
llvm-svn: 151229
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 9 |
2 files changed, 8 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 94d8f62ba6d..05136b882bd 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -6226,10 +6226,8 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, // completed by the initializer. For example: // int ary[] = { 1, 3, 5 }; // "ary" transitions from an IncompleteArrayType to a ConstantArrayType. - if (!VDecl->isInvalidDecl() && (DclT != SavT)) { + if (!VDecl->isInvalidDecl() && (DclT != SavT)) VDecl->setType(DclT); - Init->setType(DclT.getNonReferenceType()); - } // Check any implicit conversions within the expression. CheckImplicitConversions(Init, VDecl->getLocation()); diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 1a62d246e4b..31e4ecb939b 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -604,7 +604,9 @@ void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, CheckListElementTypes(Entity, IList, T, /*SubobjectIsDesignatorContext=*/true, Index, StructuredList, StructuredIndex, TopLevelObject); if (!VerifyOnly) { - QualType ExprTy = T.getNonLValueExprType(SemaRef.Context); + QualType ExprTy = T; + if (!ExprTy->isArrayType()) + ExprTy = ExprTy.getNonLValueExprType(SemaRef.Context); IList->setType(ExprTy); StructuredList->setType(ExprTy); } @@ -2077,7 +2079,10 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, InitRange.getBegin(), 0, 0, InitRange.getEnd()); - Result->setType(CurrentObjectType.getNonLValueExprType(SemaRef.Context)); + QualType ResultType = CurrentObjectType; + if (!ResultType->isArrayType()) + ResultType = ResultType.getNonLValueExprType(SemaRef.Context); + Result->setType(ResultType); // Pre-allocate storage for the structured initializer list. unsigned NumElements = 0; |