summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rwxr-xr-xclang/lib/Sema/SemaTemplate.cpp5
-rw-r--r--clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp10
2 files changed, 10 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 44b58e1a80a..c05a08f59ac 100755
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -7164,6 +7164,11 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
// [temp.constr.order].
SmallVector<const Expr *, 3> ParamsAC, TemplateAC;
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);
bool IsParamAtLeastAsConstrained;
if (IsAtLeastAsConstrained(Param, ParamsAC, Template, TemplateAC,
diff --git a/clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp b/clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp
index 593336163fa..e7feae31889 100644
--- a/clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp
+++ b/clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp
@@ -7,9 +7,9 @@ template<typename T> concept F = T::f();
// expected-note@-1{{similar constraint expressions not considered equivalent}}
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<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<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<Y> s22; // expected-error{{template template argument 'Y' is more constrained than template template parameter 'P'}}
+S2<X> s21;
+S2<Y> s22;
S2<Z> s23;
template <template <typename...> class C>
OpenPOWER on IntegriCloud