diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-05-22 21:13:27 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-05-22 21:13:27 +0000 |
| commit | a8db954f241b340b9ce1466ea3c4a17969573af5 (patch) | |
| tree | 2189373c16d1174b49fafc5f439c6df83a75926c /clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | |
| parent | c996521508210a67a2f5e6ef3c0d78a0bb273d4b (diff) | |
| download | bcm5719-llvm-a8db954f241b340b9ce1466ea3c4a17969573af5.tar.gz bcm5719-llvm-a8db954f241b340b9ce1466ea3c4a17969573af5.zip | |
Representation of and template instantiation for member
expressions. This change introduces another AST node,
CXXUnresolvedMemberExpr, that captures member references (x->m, x.m)
when the base of the expression (the "x") is type-dependent, and we
therefore cannot resolve the member reference yet.
Note that our parsing of member references for C++ is still quite
poor, e.g., we don't handle x->Base::m or x->operator int.
llvm-svn: 72281
Diffstat (limited to 'clang/lib/Sema/SemaTemplateInstantiateExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index fd88b934fbf..6ef748cff29 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -48,7 +48,7 @@ namespace { OwningExprResult VisitUnaryOperator(UnaryOperator *E); OwningExprResult VisitArraySubscriptExpr(ArraySubscriptExpr *E); OwningExprResult VisitCallExpr(CallExpr *E); - // FIXME: VisitMemberExpr + OwningExprResult VisitMemberExpr(MemberExpr *E); OwningExprResult VisitCompoundLiteralExpr(CompoundLiteralExpr *E); OwningExprResult VisitBinaryOperator(BinaryOperator *E); OwningExprResult VisitCompoundAssignOperator(CompoundAssignOperator *E); @@ -96,6 +96,7 @@ namespace { OwningExprResult VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E); OwningExprResult VisitCXXUnresolvedConstructExpr( CXXUnresolvedConstructExpr *E); + OwningExprResult VisitCXXUnresolvedMemberExpr(CXXUnresolvedMemberExpr *E); OwningExprResult VisitGNUNullExpr(GNUNullExpr *E); OwningExprResult VisitUnresolvedFunctionNameExpr( UnresolvedFunctionNameExpr *E); @@ -289,6 +290,26 @@ Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) { } Sema::OwningExprResult +TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) { + // Instantiate the base of the expression. + OwningExprResult Base = Visit(E->getBase()); + if (Base.isInvalid()) + return SemaRef.ExprError(); + + // FIXME: Handle declaration names here + SourceLocation FakeOperatorLoc = + SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); + return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0, + move(Base), + /*FIXME*/FakeOperatorLoc, + E->isArrow()? tok::arrow + : tok::period, + E->getMemberLoc(), + /*FIXME:*/*E->getMemberDecl()->getIdentifier(), + /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); +} + +Sema::OwningExprResult TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { SourceLocation FakeTypeLoc = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); @@ -1159,6 +1180,24 @@ TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr( } Sema::OwningExprResult +TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr( + CXXUnresolvedMemberExpr *E) { + // Instantiate the base of the expression. + OwningExprResult Base = Visit(E->getBase()); + if (Base.isInvalid()) + return SemaRef.ExprError(); + + // FIXME: Instantiate the declaration name. + return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0, + move(Base), E->getOperatorLoc(), + E->isArrow()? tok::arrow + : tok::period, + E->getMemberLoc(), + /*FIXME:*/*E->getMember().getAsIdentifierInfo(), + /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); +} + +Sema::OwningExprResult Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) { if (!E) return Owned((Expr *)0); |

