[PATCH] D122083: [Concepts] Fix placeholder constraints when references are involved
Roy Jacobson via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 19 14:24:42 PDT 2022
royjacobson created this revision.
Herald added a project: All.
royjacobson requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Placeholder types were not checked for constraint satisfaction when modified by references.
GitHub issue #54443
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D122083
Files:
clang/lib/Sema/SemaTemplateDeduction.cpp
clang/test/SemaTemplate/concepts.cpp
Index: clang/test/SemaTemplate/concepts.cpp
===================================================================
--- clang/test/SemaTemplate/concepts.cpp
+++ clang/test/SemaTemplate/concepts.cpp
@@ -171,7 +171,7 @@
}
namespace PR49188 {
- template<class T> concept C = false; // expected-note 6 {{because 'false' evaluated to false}}
+ template<class T> concept C = false; // expected-note 7 {{because 'false' evaluated to false}}
C auto f1() { // expected-error {{deduced type 'void' does not satisfy 'C'}}
return void();
@@ -189,7 +189,7 @@
}
C decltype(auto) f6() { // expected-error {{deduced type 'void' does not satisfy 'C'}}
}
- C auto& f7() { // expected-error {{cannot form a reference to 'void'}}
+ C auto& f7() { // expected-error {{deduced type 'void' does not satisfy 'C'}}
return void();
}
C auto& f8() {
@@ -222,3 +222,26 @@
};
void (*f2)() = B::f; // expected-error {{address of overloaded function 'f' does not match required type}}
}
+
+namespace PR54443 {
+
+template <class T, class U>
+struct is_same { static constexpr bool value = false; };
+
+template <class T>
+struct is_same<T, T> { static constexpr bool value = true; };
+
+template <class T, class U>
+concept same_as = is_same<T, U>::value; // expected-note-re 4 {{because {{.*}} evaluated to false}}
+
+int const &f();
+
+same_as<int const> auto i1 = f(); // expected-error {{deduced type 'int' does not satisfy 'same_as<const int>'}}
+same_as<int const> auto &i2 = f();
+same_as<int const> auto &&i3 = f(); // expected-error {{deduced type 'const int &' does not satisfy 'same_as<const int>'}}
+
+same_as<int const &> auto i4 = f(); // expected-error {{deduced type 'int' does not satisfy 'same_as<const int &>'}}
+same_as<int const &> auto &i5 = f(); // expected-error {{deduced type 'const int' does not satisfy 'same_as<const int &>'}}
+same_as<int const &> auto &&i6 = f();
+
+}
Index: clang/lib/Sema/SemaTemplateDeduction.cpp
===================================================================
--- clang/lib/Sema/SemaTemplateDeduction.cpp
+++ clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -4769,7 +4769,8 @@
return DAR_FailedAlreadyDiagnosed;
}
- if (const auto *AT = Type.getType()->getAs<AutoType>()) {
+ if (const auto *AT =
+ Type.getType().getNonReferenceType()->getAs<AutoType>()) {
if (AT->isConstrained() && !IgnoreConstraints) {
auto ConstraintsResult =
CheckDeducedPlaceholderConstraints(*this, *AT,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D122083.416739.patch
Type: text/x-patch
Size: 2489 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220319/569f7037/attachment.bin>
More information about the cfe-commits
mailing list