From 6a573fe543121bcfa3f84ec71a39ddabf22dc7d9 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 22 Oct 2009 18:02:20 +0000 Subject: [PATCH] When replacing a template-id expression with a declaration reference expression after overloading completes, make sure to keep the qualifier. Still not ready with that test-case... llvm-svn: 84880 --- clang/lib/Sema/SemaOverload.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index bcca6ece80b3..ebcf3ad8e2bc 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -5383,6 +5383,8 @@ Expr *Sema::FixOverloadedFunctionReference(Expr *E, FunctionDecl *Fn) { ClassType.getTypePtr())); return E; } + // FIXME: TemplateIdRefExpr referring to a member function template + // specialization! } Expr *NewExpr = FixOverloadedFunctionReference(UnOp->getSubExpr(), Fn); UnOp->setSubExpr(NewExpr); @@ -5399,10 +5401,17 @@ Expr *Sema::FixOverloadedFunctionReference(Expr *E, FunctionDecl *Fn) { MemExpr->setMemberDecl(Fn); E->setType(Fn->getType()); } else if (TemplateIdRefExpr *TID = dyn_cast(E)) { - // FIXME: Should we create QualifiedDeclRefExprs here too? // FIXME: We should capture the template arguments here. - E = new (Context) DeclRefExpr(Fn, Fn->getType(), - TID->getSourceRange().getBegin()); + if (NestedNameSpecifier *Qualifier = TID->getQualifier()) + E = new (Context) QualifiedDeclRefExpr(Fn, Fn->getType(), + TID->getTemplateNameLoc(), + /*FIXME?*/false, /*FIXME?*/false, + TID->getQualifierRange(), + Qualifier); + else + E = new (Context) DeclRefExpr(Fn, Fn->getType(), + TID->getTemplateNameLoc()); + TID->Destroy(Context); } else { assert(false && "Invalid reference to overloaded function"); -- GitLab