From 5b4748e3ae06a5b90ecb2c84b7df989a94733175 Mon Sep 17 00:00:00 2001 From: erichkeane Date: Mon, 18 Sep 2023 11:38:12 -0700 Subject: [PATCH 1/3] In ExprRequirement building, treat OverloadExpr as dependent As reported in #66612, we aren't correctly treating the placeholder expression type correctly, so we ended up trying to get a reference version of it, and this resulted in an assertion, since the placeholder type cannot have a reference added. Fixes: #66612 --- clang/lib/Sema/SemaExprCXX.cpp | 3 ++- clang/test/SemaTemplate/concepts.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index bb4ef065d5c72..77289595972e3 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -9063,7 +9063,8 @@ Sema::BuildExprRequirement( concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement) { auto Status = concepts::ExprRequirement::SS_Satisfied; ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr; - if (E->isInstantiationDependent() || ReturnTypeRequirement.isDependent()) + if (E->isInstantiationDependent() || E->getType()->isPlaceholderType() || + ReturnTypeRequirement.isDependent()) Status = concepts::ExprRequirement::SS_Dependent; else if (NoexceptLoc.isValid() && canThrow(E) == CanThrowResult::CT_Can) Status = concepts::ExprRequirement::SS_NoexceptNotMet; diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp index 891b45aa57892..68050e0f09e24 100644 --- a/clang/test/SemaTemplate/concepts.cpp +++ b/clang/test/SemaTemplate/concepts.cpp @@ -1031,3 +1031,20 @@ void test() { fff(42UL); // expected-error {{no matching function}} } } + +namespace GH66612 { + template + auto end(C c) ->int; + + template + concept Iterator = true; + + template + concept Container = requires(CT b) { + { end } -> Iterator; // #66612GH_END + }; + + static_assert(Container);// expected-error{{static assertion failed}} + // expected-note@-1{{because 'int' does not satisfy 'Container'}} + // expected-note@#66612GH_END{{because 'end' would be invalid: reference to overloaded function could not be resolved; did you mean to call it?}} +} From 8956c6575db7a7a9cbfd3750ea688f78b3fb4d53 Mon Sep 17 00:00:00 2001 From: erichkeane Date: Mon, 18 Sep 2023 12:51:36 -0700 Subject: [PATCH 2/3] Add Release Note --- clang/docs/ReleaseNotes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 500f9c9a0cda7..3ff5882b081d8 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -291,6 +291,9 @@ Bug Fixes to C++ Support pointers on win32. (`#62594 `_) +- Clang now no longer asserts when an UnresolvedLookupExpr is used as an + expression requirement. (`#66612 https://github.com/llvm/llvm-project/issues/66612`) + Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ - Fixed an import failure of recursive friend class template. From 71cf811d6bb793ce8fa076f3af63523ebf1722e8 Mon Sep 17 00:00:00 2001 From: erichkeane Date: Tue, 19 Sep 2023 07:14:18 -0700 Subject: [PATCH 3/3] Fix release notes --- clang/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 01f97ffd857b3..ba91f9481fe98 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -304,7 +304,7 @@ Bug Fixes to C++ Support - Fix crash for a lambda attribute with a statement expression that contains a `return`. (`#48527 `_) - + - Clang now no longer asserts when an UnresolvedLookupExpr is used as an expression requirement. (`#66612 https://github.com/llvm/llvm-project/issues/66612`)