Skip to content

Commit 5de708b

Browse files
committed
support SFINAE for classes
#feat
1 parent fd90016 commit 5de708b

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

src/lib/AST/ASTVisitor.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,6 +1193,34 @@ populate(
11931193
populate(Template.Args, CTSD->getTemplateArgs().asArray());
11941194
}
11951195

1196+
// Extract requires clause from SFINAE context
1197+
for (auto it = Template.Args.begin(); it != Template.Args.end();)
1198+
{
1199+
auto& arg = *it;
1200+
if (!arg)
1201+
{
1202+
++it;
1203+
continue;
1204+
}
1205+
if (auto* T = dynamic_cast<TypeTArg*>(arg.get());
1206+
T &&
1207+
T->Type &&
1208+
!T->Type->Constraints.empty())
1209+
{
1210+
for (ExprInfo const& constraint: T->Type->Constraints)
1211+
{
1212+
if (!Template.Requires.Written.empty())
1213+
{
1214+
Template.Requires.Written += " && ";
1215+
}
1216+
Template.Requires.Written += constraint.Written;
1217+
}
1218+
it = Template.Args.erase(it);
1219+
continue;
1220+
}
1221+
++it;
1222+
}
1223+
11961224
// Extract the template parameters if this is a partial specialization
11971225
if (auto* CTPSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(CTSD))
11981226
{

0 commit comments

Comments
 (0)