From 98aff7d4fcf8aa2f63643915dad08df4c4c557a6 Mon Sep 17 00:00:00 2001 From: Younan Zhang Date: Mon, 7 Oct 2024 09:38:19 +0800 Subject: [PATCH] [Clang] Remove the special-casing for RequiresExprBodyDecl in BuildResolvedCallExpr() after fd87d765c0 (#111277) The special-casing for RequiresExprBodyDecl caused a regression, as reported in #110785. The original fix for #84020 has been superseded by fd87d765c0, which establishes a `DependentScopeDeclRefExpr` instead of a `CXXDependentScopeMemberExpr` for the case in issue. So the spurious diagnostic in #84020 would no longer occur. This also merges the test for #84020 together with that for #110785 into clang/test/SemaTemplate/instantiate-requires-expr.cpp. No release note because I think this merits a backport. Fixes #110785 (cherry picked from commit 8c1547055eaf65003f3e6fd024195f4926ff2356) --- clang/lib/Sema/SemaExpr.cpp | 3 +- clang/lib/Sema/TreeTransform.h | 2 +- clang/test/SemaCXX/PR84020.cpp | 23 -------------- .../instantiate-requires-expr.cpp | 31 +++++++++++++++++++ 4 files changed, 33 insertions(+), 26 deletions(-) delete mode 100644 clang/test/SemaCXX/PR84020.cpp diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index f56ca398cda81c..687b1be9459219 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -6922,8 +6922,7 @@ ExprResult Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, } if (CXXMethodDecl *Method = dyn_cast_or_null(FDecl)) - if (!isa(CurContext) && - Method->isImplicitObjectMemberFunction()) + if (Method->isImplicitObjectMemberFunction()) return ExprError(Diag(LParenLoc, diag::err_member_call_without_object) << Fn->getSourceRange() << 0); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 51e6a4845bf6fd..0ae393524fe03a 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13608,7 +13608,7 @@ bool TreeTransform::TransformOverloadExprDecls(OverloadExpr *Old, } AllEmptyPacks &= Decls.empty(); - }; + } // C++ [temp.res]/8.4.2: // The program is ill-formed, no diagnostic required, if [...] lookup for diff --git a/clang/test/SemaCXX/PR84020.cpp b/clang/test/SemaCXX/PR84020.cpp deleted file mode 100644 index 8ea5dcc4527ae7..00000000000000 --- a/clang/test/SemaCXX/PR84020.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// RUN: %clang_cc1 -std=c++20 -verify %s -// RUN: %clang_cc1 -std=c++23 -verify %s -// expected-no-diagnostics - -struct B { - template - void foo(); - - void bar(); -}; - -template -struct A : T { - auto foo() { - static_assert(requires { T::template foo(); }); - static_assert(requires { T::bar(); }); - } -}; - -int main() { - A a; - a.foo(); -} diff --git a/clang/test/SemaTemplate/instantiate-requires-expr.cpp b/clang/test/SemaTemplate/instantiate-requires-expr.cpp index 20a19d731ae169..a1f5456156a06f 100644 --- a/clang/test/SemaTemplate/instantiate-requires-expr.cpp +++ b/clang/test/SemaTemplate/instantiate-requires-expr.cpp @@ -237,3 +237,34 @@ constexpr bool e_v = true; static_assert(e_v); } // namespace GH73885 + +namespace GH84020 { + +struct B { + template void foo(); + void bar(); +}; + +template struct A : T { + void foo() { + static_assert(requires { T::template foo(); }); + static_assert(requires { T::bar(); }); + } +}; + +template class A; + +} // namespace GH84020 + +namespace GH110785 { + +struct Foo { + static void f(auto) requires(false) {} + void f(int) {} + + static_assert([](auto v) { + return requires { f(v); }; + } (0) == false); +}; + +} // namespace GH110785