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,
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,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits