Skip to content

Commit f567b00

Browse files
committedOct 17, 2019
[Concepts] ConceptSpecializationExprs mangling
Implement mangling for CSEs to match regular template-ids. Reviewed as part of D41569 <https://reviews.llvm.org/D41569>. Re-commit fixing failing test. llvm-svn: 375063
1 parent 755420c commit f567b00

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed
 

‎clang/lib/AST/ItaniumMangle.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,7 @@ void CXXNameMangler::mangleUnscopedTemplateName(
969969
assert(!AdditionalAbiTags &&
970970
"template template param cannot have abi tags");
971971
mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
972-
} else if (isa<BuiltinTemplateDecl>(ND)) {
972+
} else if (isa<BuiltinTemplateDecl>(ND) || isa<ConceptDecl>(ND)) {
973973
mangleUnscopedName(ND, AdditionalAbiTags);
974974
} else {
975975
mangleUnscopedName(ND->getTemplatedDecl(), AdditionalAbiTags);
@@ -1890,7 +1890,7 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND,
18901890
mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
18911891
} else {
18921892
manglePrefix(getEffectiveDeclContext(ND), NoFunction);
1893-
if (isa<BuiltinTemplateDecl>(ND))
1893+
if (isa<BuiltinTemplateDecl>(ND) || isa<ConceptDecl>(ND))
18941894
mangleUnqualifiedName(ND, nullptr);
18951895
else
18961896
mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr);
@@ -3658,7 +3658,6 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
36583658
case Expr::ConvertVectorExprClass:
36593659
case Expr::StmtExprClass:
36603660
case Expr::TypeTraitExprClass:
3661-
case Expr::ConceptSpecializationExprClass:
36623661
case Expr::ArrayTypeTraitExprClass:
36633662
case Expr::ExpressionTraitExprClass:
36643663
case Expr::VAArgExprClass:
@@ -4168,6 +4167,18 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
41684167
mangleExpression(cast<ParenExpr>(E)->getSubExpr(), Arity);
41694168
break;
41704169

4170+
4171+
case Expr::ConceptSpecializationExprClass: {
4172+
// <expr-primary> ::= L <mangled-name> E # external name
4173+
Out << "L_Z";
4174+
auto *CSE = cast<ConceptSpecializationExpr>(E);
4175+
mangleTemplateName(CSE->getNamedConcept(),
4176+
CSE->getTemplateArguments().data(),
4177+
CSE->getTemplateArguments().size());
4178+
Out << 'E';
4179+
break;
4180+
}
4181+
41714182
case Expr::DeclRefExprClass:
41724183
mangleDeclRefExpr(cast<DeclRefExpr>(E)->getDecl());
41734184
break;

‎clang/lib/Sema/SemaTemplate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4302,7 +4302,7 @@ ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS,
43024302
TemplateKWLoc, TemplateArgs);
43034303
}
43044304

4305-
if (R.getAsSingle<ConceptDecl>() && !AnyDependentArguments()) {
4305+
if (R.getAsSingle<ConceptDecl>()) {
43064306
return CheckConceptTemplateId(SS, TemplateKWLoc,
43074307
R.getLookupNameInfo().getBeginLoc(),
43084308
R.getFoundDecl(),
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++2a -fconcepts-ts -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
2+
// expected-no-diagnostics
3+
4+
namespace test1 {
5+
template <bool> struct S {};
6+
template <typename> concept C = true;
7+
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
8+
template S<C<int>> f0<>();
9+
// CHECK: @_ZN5test12f0IiEENS_1SIXL_ZNS_1CIT_EEEEEEv(
10+
}
11+
12+
template <bool> struct S {};
13+
template <typename> concept C = true;
14+
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
15+
template S<C<int>> f0<>();
16+
// CHECK: @_Z2f0IiE1SIXL_Z1CIT_EEEEv(

0 commit comments

Comments
 (0)