forked from OSchip/llvm-project
[Concepts] ConceptSpecializationExprs mangling
Implement mangling for CSEs to match regular template-ids. Reviewed as part of D41569. llvm-svn: 374967
This commit is contained in:
parent
ecc4680c06
commit
5e34ad109c
|
@ -969,7 +969,7 @@ void CXXNameMangler::mangleUnscopedTemplateName(
|
||||||
assert(!AdditionalAbiTags &&
|
assert(!AdditionalAbiTags &&
|
||||||
"template template param cannot have abi tags");
|
"template template param cannot have abi tags");
|
||||||
mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
||||||
} else if (isa<BuiltinTemplateDecl>(ND)) {
|
} else if (isa<BuiltinTemplateDecl>(ND) || isa<ConceptDecl>(ND)) {
|
||||||
mangleUnscopedName(ND, AdditionalAbiTags);
|
mangleUnscopedName(ND, AdditionalAbiTags);
|
||||||
} else {
|
} else {
|
||||||
mangleUnscopedName(ND->getTemplatedDecl(), AdditionalAbiTags);
|
mangleUnscopedName(ND->getTemplatedDecl(), AdditionalAbiTags);
|
||||||
|
@ -1890,7 +1890,7 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND,
|
||||||
mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
|
||||||
} else {
|
} else {
|
||||||
manglePrefix(getEffectiveDeclContext(ND), NoFunction);
|
manglePrefix(getEffectiveDeclContext(ND), NoFunction);
|
||||||
if (isa<BuiltinTemplateDecl>(ND))
|
if (isa<BuiltinTemplateDecl>(ND) || isa<ConceptDecl>(ND))
|
||||||
mangleUnqualifiedName(ND, nullptr);
|
mangleUnqualifiedName(ND, nullptr);
|
||||||
else
|
else
|
||||||
mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr);
|
mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr);
|
||||||
|
@ -3658,7 +3658,6 @@ recurse:
|
||||||
case Expr::ConvertVectorExprClass:
|
case Expr::ConvertVectorExprClass:
|
||||||
case Expr::StmtExprClass:
|
case Expr::StmtExprClass:
|
||||||
case Expr::TypeTraitExprClass:
|
case Expr::TypeTraitExprClass:
|
||||||
case Expr::ConceptSpecializationExprClass:
|
|
||||||
case Expr::ArrayTypeTraitExprClass:
|
case Expr::ArrayTypeTraitExprClass:
|
||||||
case Expr::ExpressionTraitExprClass:
|
case Expr::ExpressionTraitExprClass:
|
||||||
case Expr::VAArgExprClass:
|
case Expr::VAArgExprClass:
|
||||||
|
@ -4168,6 +4167,18 @@ recurse:
|
||||||
mangleExpression(cast<ParenExpr>(E)->getSubExpr(), Arity);
|
mangleExpression(cast<ParenExpr>(E)->getSubExpr(), Arity);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case Expr::ConceptSpecializationExprClass: {
|
||||||
|
// <expr-primary> ::= L <mangled-name> E # external name
|
||||||
|
Out << "L_Z";
|
||||||
|
auto *CSE = cast<ConceptSpecializationExpr>(E);
|
||||||
|
mangleTemplateName(CSE->getNamedConcept(),
|
||||||
|
CSE->getTemplateArguments().data(),
|
||||||
|
CSE->getTemplateArguments().size());
|
||||||
|
Out << 'E';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case Expr::DeclRefExprClass:
|
case Expr::DeclRefExprClass:
|
||||||
mangleDeclRefExpr(cast<DeclRefExpr>(E)->getDecl());
|
mangleDeclRefExpr(cast<DeclRefExpr>(E)->getDecl());
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -4302,7 +4302,7 @@ ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS,
|
||||||
TemplateKWLoc, TemplateArgs);
|
TemplateKWLoc, TemplateArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R.getAsSingle<ConceptDecl>() && !AnyDependentArguments()) {
|
if (R.getAsSingle<ConceptDecl>()) {
|
||||||
return CheckConceptTemplateId(SS, TemplateKWLoc,
|
return CheckConceptTemplateId(SS, TemplateKWLoc,
|
||||||
R.getLookupNameInfo().getBeginLoc(),
|
R.getLookupNameInfo().getBeginLoc(),
|
||||||
R.getFoundDecl(),
|
R.getFoundDecl(),
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
// RUN: %clang_cc1 -verify -Wno-return-type -Wno-main -std=c++2a -fconcepts-ts -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
|
||||||
|
// expected-no-diagnostics
|
||||||
|
|
||||||
|
namespace test1 {
|
||||||
|
template <bool> struct S {};
|
||||||
|
template <typename> concept C = true;
|
||||||
|
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
|
||||||
|
template S<C<int>> f0<>();
|
||||||
|
// CHECK: void @_ZN5test12f0IiEENS_1SIXL_ZNS_1CIT_EEEEEEv()
|
||||||
|
}
|
||||||
|
|
||||||
|
template <bool> struct S {};
|
||||||
|
template <typename> concept C = true;
|
||||||
|
template <typename T = int> S<C<T>> f0() { return S<C<T>>{}; }
|
||||||
|
template S<C<int>> f0<>();
|
||||||
|
// CHECK: void @_Z2f0IiE1SIXL_Z1CIT_EEEEv()
|
Loading…
Reference in New Issue