From: Douglas Gregor Date: Mon, 31 Aug 2009 20:00:26 +0000 (+0000) Subject: Implement template instantiation for member operator access. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=017dde547d359a66ec38b80a098a5ddbef087048;p=clang Implement template instantiation for member operator access. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80609 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 8aabad575a..deb54115a5 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -837,10 +837,10 @@ public: OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, bool isArrow, SourceLocation MemberLoc, NamedDecl *Member) { - return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, + return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, isArrow? tok::arrow : tok::period, MemberLoc, - /*FIXME*/*Member->getIdentifier(), + Member->getDeclName(), /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); } @@ -1435,10 +1435,10 @@ public: CXXScopeSpec SS; SS.setRange(QualifierRange); SS.setScopeRep(Qualifier); - return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, + return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, isArrow? tok::arrow : tok::period, MemberLoc, - /*FIXME*/*Member->getIdentifier(), + Member->getDeclName(), /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), &SS); } @@ -1459,12 +1459,10 @@ public: if (Base.isInvalid()) return SemaRef.ExprError(); - assert(Name.getAsIdentifierInfo() && - "Cannot transform member references with non-identifier members"); - Base = SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0, + Base = SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OperatorLoc, OpKind, - MemberLoc, - *Name.getAsIdentifierInfo(), + MemberLoc, + Name, /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); SemaRef.ActOnCXXExitMemberScope(0, SS); return move(Base); diff --git a/test/SemaTemplate/instantiate-expr-2.cpp b/test/SemaTemplate/instantiate-expr-2.cpp index 80f403ed56..2c3ccb06e4 100644 --- a/test/SemaTemplate/instantiate-expr-2.cpp +++ b/test/SemaTemplate/instantiate-expr-2.cpp @@ -130,3 +130,19 @@ struct X0 { void test_X0(X0 x, IntegralConstant ic) { x.f(5,ic); } + +namespace N8 { + struct X { + X operator+(const X&) const; + }; + + template + T test_plus(const T* xp, const T& x, const T& y) { + x.operator+(y); + return xp->operator+(y); + } + + void test_test_plus(X x) { + test_plus(&x, x, x); + } +}