diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-17 05:12:35 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-17 05:12:35 +0000 |
commit | 01ee2dcc3034eca657a14a7af725026e1a7de939 (patch) | |
tree | d0f40a620d15d84d4e5638d4a70f97c36fbec15f /lib/Sema/SemaInit.cpp | |
parent | 94b86863ab85e2e9b84fef863c01f5f43e3fe26b (diff) |
Track the difference between
-- a constructor list initialization that unpacked an initializer list into
constructor arguments and
-- a list initialization that created as std::initializer_list and passed it
as the first argument to a constructor
in the AST. Use this flag while instantiating templates to provide the right
semantics for the resulting initialization.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213224 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r-- | lib/Sema/SemaInit.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index f6d0b80f5c..4b756064ad 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -2760,7 +2760,6 @@ void InitializationSequence::Step::Destroy() { case SK_QualificationConversionLValue: case SK_LValueToRValue: case SK_ListInitialization: - case SK_ListConstructorCall: case SK_UnwrapInitList: case SK_RewrapInitList: case SK_ConstructorInitialization: @@ -2775,6 +2774,7 @@ void InitializationSequence::Step::Destroy() { case SK_PassByIndirectRestore: case SK_ProduceObjCObject: case SK_StdInitializerList: + case SK_StdInitializerListConstructorCall: case SK_OCLSamplerInit: case SK_OCLZeroEvent: break; @@ -2945,7 +2945,7 @@ InitializationSequence bool HadMultipleCandidates, bool FromInitList, bool AsInitList) { Step S; - S.Kind = FromInitList ? AsInitList ? SK_ListConstructorCall + S.Kind = FromInitList ? AsInitList ? SK_StdInitializerListConstructorCall : SK_ConstructorInitializationFromList : SK_ConstructorInitialization; S.Type = T; @@ -5148,6 +5148,7 @@ static ExprResult CopyObject(Sema &S, ConstructorArgs, HadMultipleCandidates, /*ListInit*/ false, + /*StdInitListInit*/ false, /*ZeroInit*/ false, CXXConstructExpr::CK_Complete, SourceRange()); @@ -5269,6 +5270,7 @@ PerformConstructorInitialization(Sema &S, const InitializationSequence::Step& Step, bool &ConstructorInitRequiresZeroInit, bool IsListInitialization, + bool IsStdInitListInitialization, SourceLocation LBraceLoc, SourceLocation RBraceLoc) { unsigned NumArgs = Args.size(); @@ -5330,7 +5332,7 @@ PerformConstructorInitialization(Sema &S, CurInit = new (S.Context) CXXTemporaryObjectExpr( S.Context, Constructor, TSInfo, ConstructorArgs, ParenOrBraceRange, HadMultipleCandidates, IsListInitialization, - ConstructorInitRequiresZeroInit); + IsStdInitListInitialization, ConstructorInitRequiresZeroInit); } else { CXXConstructExpr::ConstructionKind ConstructKind = CXXConstructExpr::CK_Complete; @@ -5359,6 +5361,7 @@ PerformConstructorInitialization(Sema &S, ConstructorArgs, HadMultipleCandidates, IsListInitialization, + IsStdInitListInitialization, ConstructorInitRequiresZeroInit, ConstructKind, ParenOrBraceRange); @@ -5368,6 +5371,7 @@ PerformConstructorInitialization(Sema &S, ConstructorArgs, HadMultipleCandidates, IsListInitialization, + IsStdInitListInitialization, ConstructorInitRequiresZeroInit, ConstructKind, ParenOrBraceRange); @@ -5784,7 +5788,7 @@ InitializationSequence::Perform(Sema &S, case SK_ConstructorInitialization: case SK_ConstructorInitializationFromList: - case SK_ListConstructorCall: + case SK_StdInitializerListConstructorCall: case SK_ZeroInitialization: break; } @@ -5959,6 +5963,7 @@ InitializationSequence::Perform(Sema &S, ConstructorArgs, HadMultipleCandidates, /*ListInit*/ false, + /*StdInitListInit*/ false, /*ZeroInit*/ false, CXXConstructExpr::CK_Complete, SourceRange()); @@ -6132,6 +6137,7 @@ InitializationSequence::Perform(Sema &S, Kind, Arg, *Step, ConstructorInitRequiresZeroInit, /*IsListInitialization*/true, + /*IsStdInitListInit*/false, InitList->getLBraceLoc(), InitList->getRBraceLoc()); break; @@ -6154,7 +6160,7 @@ InitializationSequence::Perform(Sema &S, } case SK_ConstructorInitialization: - case SK_ListConstructorCall: { + case SK_StdInitializerListConstructorCall: { // When an initializer list is passed for a parameter of type "reference // to object", we don't get an EK_Temporary entity, but instead an // EK_Parameter entity with reference type. @@ -6164,10 +6170,13 @@ InitializationSequence::Perform(Sema &S, InitializedEntity TempEntity = InitializedEntity::InitializeTemporary( Entity.getType().getNonReferenceType()); bool UseTemporary = Entity.getType()->isReferenceType(); + bool IsStdInitListInit = + Step->Kind == SK_StdInitializerListConstructorCall; CurInit = PerformConstructorInitialization( S, UseTemporary ? TempEntity : Entity, Kind, Args, *Step, ConstructorInitRequiresZeroInit, - /*IsListInitialization*/Step->Kind == SK_ListConstructorCall, + /*IsListInitialization*/IsStdInitListInit, + /*IsStdInitListInitialization*/IsStdInitListInit, /*LBraceLoc*/SourceLocation(), /*RBraceLoc*/SourceLocation()); break; @@ -7030,10 +7039,6 @@ void InitializationSequence::dump(raw_ostream &OS) const { OS << "list initialization via constructor"; break; - case SK_ListConstructorCall: - OS << "list initialization via initializer list constructor"; - break; - case SK_ZeroInitialization: OS << "zero initialization"; break; @@ -7074,6 +7079,10 @@ void InitializationSequence::dump(raw_ostream &OS) const { OS << "std::initializer_list from initializer list"; break; + case SK_StdInitializerListConstructorCall: + OS << "list initialization from std::initializer_list"; + break; + case SK_OCLSamplerInit: OS << "OpenCL sampler_t from integer constant"; break; |