diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-11-22 00:01:44 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-11-22 00:01:44 +0000 |
commit | 2ca3db4876207a0f2d9ed683b0d3b6f3193f39bc (patch) | |
tree | 52de6a9b87867c4c579ea54a82dbf446cdb28a18 | |
parent | 13ba7190c087d592104ca4f6b730a62647ee277e (diff) | |
download | clang-2ca3db4876207a0f2d9ed683b0d3b6f3193f39bc.tar.gz clang-2ca3db4876207a0f2d9ed683b0d3b6f3193f39bc.tar.bz2 clang-2ca3db4876207a0f2d9ed683b0d3b6f3193f39bc.tar.xz |
Merging r195384:
------------------------------------------------------------------------
r195384 | rsmith | 2013-11-21 15:30:57 -0800 (Thu, 21 Nov 2013) | 2 lines
PR18013: Don't assert diagnosing a bad std::initializer_list construction.
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_34@195394 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaInit.cpp | 32 | ||||
-rw-r--r-- | test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp | 5 |
2 files changed, 30 insertions, 7 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 72c37ebd13..0ce6f51a4b 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -6293,6 +6293,28 @@ static void emitBadConversionNotes(Sema &S, const InitializedEntity &entity, } } +static void diagnoseListInit(Sema &S, const InitializedEntity &Entity, + InitListExpr *InitList) { + QualType DestType = Entity.getType(); + + QualType E; + if (S.getLangOpts().CPlusPlus11 && S.isStdInitializerList(DestType, &E)) { + QualType ArrayType = S.Context.getConstantArrayType( + E.withConst(), + llvm::APInt(S.Context.getTypeSize(S.Context.getSizeType()), + InitList->getNumInits()), + clang::ArrayType::Normal, 0); + InitializedEntity HiddenArray = + InitializedEntity::InitializeTemporary(ArrayType); + return diagnoseListInit(S, HiddenArray, InitList); + } + + InitListChecker DiagnoseInitList(S, Entity, InitList, DestType, + /*VerifyOnly=*/false); + assert(DiagnoseInitList.HadError() && + "Inconsistent init list check result."); +} + bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, @@ -6340,7 +6362,7 @@ bool InitializationSequence::Diagnose(Sema &S, break; case FK_ArrayTypeMismatch: case FK_NonConstantArrayInit: - S.Diag(Kind.getLocation(), + S.Diag(Kind.getLocation(), (Failure == FK_ArrayTypeMismatch ? diag::err_array_init_different_type : diag::err_array_init_non_constant_array)) @@ -6632,12 +6654,8 @@ bool InitializationSequence::Diagnose(Sema &S, case FK_ListInitializationFailed: { // Run the init list checker again to emit diagnostics. - InitListExpr* InitList = cast<InitListExpr>(Args[0]); - QualType DestType = Entity.getType(); - InitListChecker DiagnoseInitList(S, Entity, InitList, - DestType, /*VerifyOnly=*/false); - assert(DiagnoseInitList.HadError() && - "Inconsistent init list check result."); + InitListExpr *InitList = cast<InitListExpr>(Args[0]); + diagnoseListInit(S, Entity, InitList); break; } diff --git a/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp index d4098a45b5..9d89cce67b 100644 --- a/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp +++ b/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp @@ -225,3 +225,8 @@ namespace RefVersusInitList { void f(std::initializer_list<S>); void g(S s) { f({S()}); } } + +namespace PR18013 { + int f(); + std::initializer_list<long (*)()> x = {f}; // expected-error {{cannot initialize an array element of type 'long (*const)()' with an lvalue of type 'int ()': different return type ('long' vs 'int')}} +} |