[clang] 13659f4 - PR50337, PR50561: Fix determination of whether a template parameter list
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 2 13:06:48 PDT 2021
Author: Richard Smith
Date: 2021-06-02T13:06:40-07:00
New Revision: 13659f48a1d7814fe893d2383acdc0b0313740a9
URL: https://github.com/llvm/llvm-project/commit/13659f48a1d7814fe893d2383acdc0b0313740a9
DIFF: https://github.com/llvm/llvm-project/commit/13659f48a1d7814fe893d2383acdc0b0313740a9.diff
LOG: PR50337, PR50561: Fix determination of whether a template parameter list
contains constrained parameters.
Added:
Modified:
clang/lib/AST/DeclTemplate.cpp
clang/test/SemaTemplate/concepts.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
index e5b1833a02f2..ec8b00a9eb7d 100644
--- a/clang/lib/AST/DeclTemplate.cpp
+++ b/clang/lib/AST/DeclTemplate.cpp
@@ -74,7 +74,8 @@ TemplateParameterList::TemplateParameterList(const ASTContext& C,
->containsUnexpandedParameterPack())
ContainsUnexpandedParameterPack = true;
}
- HasConstrainedParameters = TTP->hasTypeConstraint();
+ if (TTP->hasTypeConstraint())
+ HasConstrainedParameters = true;
} else {
llvm_unreachable("unexpcted template parameter type");
}
diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp
index 60c8bc59d33c..c297a75dd82e 100644
--- a/clang/test/SemaTemplate/concepts.cpp
+++ b/clang/test/SemaTemplate/concepts.cpp
@@ -154,3 +154,18 @@ namespace NoConstantFolding {
template <class T> concept C = &n + 3 - 3 == &n; // expected-error {{non-constant expression}} expected-note {{cannot refer to element 3 of non-array object}}
static_assert(C<void>); // expected-note {{while checking}}
}
+
+namespace PR50337 {
+ template <typename T> concept foo = true;
+ template <typename T> concept foo2 = foo<T> && true;
+ void f(foo auto, auto);
+ void f(foo2 auto, auto);
+ void g() { f(1, 2); }
+}
+
+namespace PR50561 {
+ template<typename> concept C = false;
+ template<typename T, typename U> void f(T, U);
+ template<C T, typename U> void f(T, U) = delete;
+ void g() { f(0, 0); }
+}
More information about the cfe-commits
mailing list