forked from OSchip/llvm-project
[Concepts] Implement P1616R1 - Using unconstrained template template parameters with constrained templates
Summary: Allow unconstrained template template parameters to accept constrainted templates as arguments. Reviewers: rsmith Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73155
This commit is contained in:
parent
c77bbea9a6
commit
d42d5eb8ea
|
@ -7164,6 +7164,11 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
|
||||||
// [temp.constr.order].
|
// [temp.constr.order].
|
||||||
SmallVector<const Expr *, 3> ParamsAC, TemplateAC;
|
SmallVector<const Expr *, 3> ParamsAC, TemplateAC;
|
||||||
Params->getAssociatedConstraints(ParamsAC);
|
Params->getAssociatedConstraints(ParamsAC);
|
||||||
|
// C++2a[temp.arg.template]p3
|
||||||
|
// [...] In this comparison, if P is unconstrained, the constraints on A
|
||||||
|
// are not considered.
|
||||||
|
if (ParamsAC.empty())
|
||||||
|
return false;
|
||||||
Template->getAssociatedConstraints(TemplateAC);
|
Template->getAssociatedConstraints(TemplateAC);
|
||||||
bool IsParamAtLeastAsConstrained;
|
bool IsParamAtLeastAsConstrained;
|
||||||
if (IsAtLeastAsConstrained(Param, ParamsAC, Template, TemplateAC,
|
if (IsAtLeastAsConstrained(Param, ParamsAC, Template, TemplateAC,
|
||||||
|
|
|
@ -7,9 +7,9 @@ template<typename T> concept F = T::f();
|
||||||
// expected-note@-1{{similar constraint expressions not considered equivalent}}
|
// expected-note@-1{{similar constraint expressions not considered equivalent}}
|
||||||
template<template<C> class P> struct S1 { }; // expected-note 2{{'P' declared here}}
|
template<template<C> class P> struct S1 { }; // expected-note 2{{'P' declared here}}
|
||||||
|
|
||||||
template<C> struct X { }; // expected-note{{'X' declared here}}
|
template<C> struct X { };
|
||||||
|
|
||||||
template<D> struct Y { }; // expected-note 2{{'Y' declared here}}
|
template<D> struct Y { }; // expected-note{{'Y' declared here}}
|
||||||
template<typename T> struct Z { };
|
template<typename T> struct Z { };
|
||||||
template<F> struct W { }; // expected-note{{'W' declared here}}
|
template<F> struct W { }; // expected-note{{'W' declared here}}
|
||||||
|
|
||||||
|
@ -18,10 +18,10 @@ S1<Y> s12; // expected-error{{template template argument 'Y' is more constrained
|
||||||
S1<Z> s13;
|
S1<Z> s13;
|
||||||
S1<W> s14; // expected-error{{template template argument 'W' is more constrained than template template parameter 'P'}}
|
S1<W> s14; // expected-error{{template template argument 'W' is more constrained than template template parameter 'P'}}
|
||||||
|
|
||||||
template<template<typename> class P> struct S2 { }; // expected-note 2{{'P' declared here}}
|
template<template<typename> class P> struct S2 { };
|
||||||
|
|
||||||
S2<X> s21; // expected-error{{template template argument 'X' is more constrained than template template parameter 'P'}}
|
S2<X> s21;
|
||||||
S2<Y> s22; // expected-error{{template template argument 'Y' is more constrained than template template parameter 'P'}}
|
S2<Y> s22;
|
||||||
S2<Z> s23;
|
S2<Z> s23;
|
||||||
|
|
||||||
template <template <typename...> class C>
|
template <template <typename...> class C>
|
||||||
|
|
Loading…
Reference in New Issue