if (!Ctx)
Ctx = D->getDeclContext();
- for (; !Ctx->isFileContext(); Ctx = Ctx->getParent()) {
+ while (!Ctx->isFileContext()) {
// Add template arguments from a class template instantiation.
if (ClassTemplateSpecializationDecl *Spec
= dyn_cast<ClassTemplateSpecializationDecl>(Ctx)) {
break;
Result.addOuterTemplateArguments(&Spec->getTemplateInstantiationArgs());
- continue;
}
// Add template arguments from a function template specialization.
- if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Ctx)) {
+ else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Ctx)) {
// FIXME: Check whether this is an explicit specialization.
if (const TemplateArgumentList *TemplateArgs
= Function->getTemplateSpecializationArgs())
Result.addOuterTemplateArguments(TemplateArgs);
-
- continue;
+
+ // If this is a friend declaration and it declares an entity at
+ // namespace scope, take arguments from its lexical parent
+ // instead of its semantic parent.
+ if (Function->getFriendObjectKind() &&
+ Function->getDeclContext()->isFileContext()) {
+ Ctx = Function->getLexicalDeclContext();
+ continue;
+ }
}
+
+ Ctx = Ctx->getParent();
}
return Result;
Function->setObjectOfFriendDecl(WasDeclared);
if (!Owner->isDependentContext())
DC->makeDeclVisibleInContext(Function);
+
+ Function->setInstantiationOfMemberFunction(D);
}
if (InitFunctionInstantiation(Function, D))