forked from OSchip/llvm-project
RP18408: If a member template is used as a template template argument, it does
not cause the template specialization to have no linkage. llvm-svn: 198726
This commit is contained in:
parent
360a1434f0
commit
26d11be738
|
@ -782,11 +782,18 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D,
|
|||
// really have linkage, but it's convenient to say they do for the
|
||||
// purposes of calculating linkage of pointer-to-data-member
|
||||
// template arguments.
|
||||
//
|
||||
// Templates also don't officially have linkage, but since we ignore
|
||||
// the C++ standard and look at template arguments when determining
|
||||
// linkage and visibility of a template specialization, we might hit
|
||||
// a template template argument that way. If we do, we need to
|
||||
// consider its linkage.
|
||||
if (!(isa<CXXMethodDecl>(D) ||
|
||||
isa<VarDecl>(D) ||
|
||||
isa<FieldDecl>(D) ||
|
||||
isa<IndirectFieldDecl>(D) ||
|
||||
isa<TagDecl>(D)))
|
||||
isa<TagDecl>(D) ||
|
||||
isa<TemplateDecl>(D)))
|
||||
return LinkageInfo::none();
|
||||
|
||||
LinkageInfo LV;
|
||||
|
|
|
@ -220,3 +220,11 @@ namespace test17 {
|
|||
}
|
||||
template int *foo<42>();
|
||||
}
|
||||
|
||||
// PR18408
|
||||
namespace test18 {
|
||||
template<template<typename> class> struct A {};
|
||||
struct B { template<typename> struct C; };
|
||||
void f(A<B::C>) {}
|
||||
// CHECK-DAG: define void @_ZN6test181fENS_1AINS_1B1CEEE(
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue