diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index bcca6ece80b33f18f12f651a46d11690e00129c2..ebcf3ad8e2bcf7b3637aa4d7e2337c65e6c863b3 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");