diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-07-20 00:12:52 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-07-20 00:12:52 +0000 |
commit | 0ff6f8f038f32d85c32fd984673cea51ef737b22 (patch) | |
tree | 844b46a5a4ecfce972764d9564035c98cd79cb66 /lib/Sema/SemaTemplateInstantiate.cpp | |
parent | 51e11f743e7478e94218b3c28283454dae1c6533 (diff) |
Replace r134583's fix for PR10290 with one which also works for non-value-dependent cases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135543 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiate.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 1988f14458..8d52951701 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1806,34 +1806,16 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, FieldDecl *OldField = FieldsWithMemberInitializers[I].first; FieldDecl *NewField = FieldsWithMemberInitializers[I].second; Expr *OldInit = OldField->getInClassInitializer(); - ExprResult NewInit = SubstExpr(OldInit, TemplateArgs); - - // If the initialization is no longer dependent, check it now. - if ((OldField->getType()->isDependentType() || OldInit->isTypeDependent() || - OldInit->isValueDependent()) && - !NewField->getType()->isDependentType() && - !NewInit.get()->isTypeDependent() && - !NewInit.get()->isValueDependent()) { - // FIXME: handle list-initialization - SourceLocation EqualLoc = NewField->getLocation(); - NewInit = PerformCopyInitialization( - InitializedEntity::InitializeMember(NewField), EqualLoc, - NewInit.release()); - - if (!NewInit.isInvalid()) { - CheckImplicitConversions(NewInit.get(), EqualLoc); - - // C++0x [class.base.init]p7: - // The initialization of each base and member constitutes a - // full-expression. - NewInit = MaybeCreateExprWithCleanups(NewInit); - } - } - if (NewInit.isInvalid()) + SourceLocation LParenLoc, RParenLoc; + ASTOwningVector<Expr*> NewArgs(*this); + if (InstantiateInitializer(OldInit, TemplateArgs, LParenLoc, NewArgs, + RParenLoc)) NewField->setInvalidDecl(); - else - NewField->setInClassInitializer(NewInit.release()); + else { + assert(NewArgs.size() == 1 && "wrong number of in-class initializers"); + ActOnCXXInClassMemberInitializer(NewField, LParenLoc, NewArgs[0]); + } } if (!FieldsWithMemberInitializers.empty()) |