зеркало из https://github.com/microsoft/clang-1.git
When instantiating a function template specialization following
template argument deduction, use the lexical declaration context as the owner for friend function templates. Fixes 2 failures in Boost.Graph. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102489 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
784f21121a
Коммит
d4598a2cc7
|
@ -1417,9 +1417,11 @@ Sema::FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate,
|
|||
|
||||
// Substitute the deduced template arguments into the function template
|
||||
// declaration to produce the function template specialization.
|
||||
DeclContext *Owner = FunctionTemplate->getDeclContext();
|
||||
if (FunctionTemplate->getFriendObjectKind())
|
||||
Owner = FunctionTemplate->getLexicalDeclContext();
|
||||
Specialization = cast_or_null<FunctionDecl>(
|
||||
SubstDecl(FunctionTemplate->getTemplatedDecl(),
|
||||
FunctionTemplate->getDeclContext(),
|
||||
SubstDecl(FunctionTemplate->getTemplatedDecl(), Owner,
|
||||
MultiLevelTemplateArgumentList(*DeducedArgumentList)));
|
||||
if (!Specialization)
|
||||
return TDK_SubstitutionFailure;
|
||||
|
|
|
@ -127,3 +127,18 @@ namespace PR6022 {
|
|||
};
|
||||
}
|
||||
|
||||
namespace FriendTemplateDefinition {
|
||||
template<unsigned > struct int_c { };
|
||||
|
||||
template<typename T>
|
||||
struct X {
|
||||
template<unsigned N>
|
||||
friend void f(X, int_c<N>) {
|
||||
int value = N;
|
||||
};
|
||||
};
|
||||
|
||||
void test_X(X<int> x, int_c<5> i5) {
|
||||
f(x, i5);
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче