[PATCH] D147722: [Concepts] Fix Function Template Concepts comparisons
Erich Keane via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 6 09:30:52 PDT 2023
erichkeane created this revision.
erichkeane added reviewers: clang-language-wg, alexander-shaposhnikov.
Herald added a project: All.
erichkeane requested review of this revision.
As reported in GH61959, the patch for https://reviews.llvm.org/D146178
regressed some comparisons of non-out-of-line function constraints.
This patch fixes it by making sure we skip the list of template
arguments from a partial specialization (where they don't really
matter!).
There was 1 other workaround that was made for checking deduced
arguments that this removes part of.
Fixes: #61959
https://reviews.llvm.org/D147722
Files:
clang/lib/Sema/SemaTemplateDeduction.cpp
clang/lib/Sema/SemaTemplateInstantiate.cpp
clang/test/SemaTemplate/concepts.cpp
Index: clang/test/SemaTemplate/concepts.cpp
===================================================================
--- clang/test/SemaTemplate/concepts.cpp
+++ clang/test/SemaTemplate/concepts.cpp
@@ -825,3 +825,34 @@
template<C<int> U> friend constexpr auto decltype(L<int>)::operator()() const;
};
} // namespace TemplateInsideNonTemplateClass
+
+namespace GH61959 {
+template <typename T0>
+concept C = (sizeof(T0) >= 4);
+
+template<typename...>
+struct Orig { };
+
+template<typename T>
+struct Orig<T> {
+ template<typename> requires C<T>
+ void f() { }
+
+ template<typename> requires true
+ void f() { }
+};
+
+template <typename...> struct Mod {};
+
+template <typename T1, typename T2>
+struct Mod<T1, T2> {
+ template <typename> requires C<T1>
+ constexpr static int f() { return 1; }
+
+ template <typename> requires C<T2>
+ constexpr static int f() { return 2; }
+};
+
+static_assert(Mod<int, char>::f<double>() == 1);
+static_assert(Mod<char, int>::f<double>() == 2);
+}
Index: clang/lib/Sema/SemaTemplateInstantiate.cpp
===================================================================
--- clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -310,6 +310,16 @@
if (const auto *VarTemplSpec =
dyn_cast<VarTemplateSpecializationDecl>(CurDecl)) {
R = HandleVarTemplateSpec(VarTemplSpec, Result, SkipForSpecialization);
+ } else if (const auto *PartialClassTemplSpec =
+ dyn_cast<ClassTemplatePartialSpecializationDecl>(CurDecl)) {
+ // We don't want the arguments from the Partial Specialization, since
+ // anything instantiating here cannot access the arguments from the
+ // specialized template anyway, so any substitution we would do with these
+ // partially specialized arguments would 'wrong' and confuse constraint
+ // instantiation. We only do this in the case of a constraint check, since
+ // code elsewhere actually uses these and replaces them later with what
+ // they mean.
+ R = Response::UseNextDecl(PartialClassTemplSpec);
} else if (const auto *ClassTemplSpec =
dyn_cast<ClassTemplateSpecializationDecl>(CurDecl)) {
R = HandleClassTemplateSpec(ClassTemplSpec, Result,
Index: clang/lib/Sema/SemaTemplateDeduction.cpp
===================================================================
--- clang/lib/Sema/SemaTemplateDeduction.cpp
+++ clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -2851,11 +2851,6 @@
VarTemplatePartialSpecializationDecl *Spec) {
return !Spec->isClassScopeExplicitSpecialization();
}
-template <>
-bool DeducedArgsNeedReplacement<ClassTemplatePartialSpecializationDecl>(
- ClassTemplatePartialSpecializationDecl *Spec) {
- return !Spec->isClassScopeExplicitSpecialization();
-}
template <typename TemplateDeclT>
static Sema::TemplateDeductionResult
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D147722.511448.patch
Type: text/x-patch
Size: 2882 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230406/4027086a/attachment-0001.bin>
More information about the cfe-commits
mailing list