Skip to content

Commit 7d7f850

Browse files
committed
Don't return reflections of partial template specializations.
Closes llvm#83.
1 parent 768689b commit 7d7f850

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

clang/lib/Sema/Metafunctions.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,10 @@ static bool isReflectableDecl(ASTContext &C, const Decl *D) {
10811081
if (Class->isInjectedClassName())
10821082
return false;
10831083

1084+
if (isa<ClassTemplatePartialSpecializationDecl,
1085+
VarTemplatePartialSpecializationDecl>(D))
1086+
return false;
1087+
10841088
return D->getCanonicalDecl() == D;
10851089
}
10861090

libcxx/test/std/experimental/reflection/members-and-subobjects.pass.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,17 @@ void fn();
155155
struct Cls {};
156156
using Alias = int;
157157

158-
template <typename T> class TCls {};
158+
template <typename T1, typename T2> class TCls {};
159159
template <typename T> void TFn() {}
160160
; // Empty declarations should not be represented in 'members_of'.
161-
template <typename T> int TVar = 0;
161+
template <typename T1, typename T2> int TVar = 0;
162162
template <typename T> using TAlias = int;
163163
template <typename T> concept Concept = requires { true; };
164164

165+
// Partial specializations are not representable in P2996.
166+
template <typename T2> class TCls<int, T2> {};
167+
template <typename T2> int TVar<int, T2> = 1;
168+
165169
} // namespace myns
166170

167171
static_assert(members_of(^myns).size() == 9);

0 commit comments

Comments
 (0)