diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index f56ca398cda81cfe1319511a906e1f08f437db5c..687b1be9459219f340669eb39f7914a8bda7f598 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<CXXMethodDecl>(FDecl)) - if (!isa<RequiresExprBodyDecl>(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 51e6a4845bf6fd55597f22e23d7296f1990c4986..0ae393524fe03a112d60b838e3e28bea3febeb15 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13608,7 +13608,7 @@ bool TreeTransform<Derived>::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 8ea5dcc4527ae7767d7504fa16352dadf7ec6f98..0000000000000000000000000000000000000000 --- 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 <typename S> - void foo(); - - void bar(); -}; - -template <typename T, typename S> -struct A : T { - auto foo() { - static_assert(requires { T::template foo<S>(); }); - static_assert(requires { T::bar(); }); - } -}; - -int main() { - A<B, double> a; - a.foo(); -} diff --git a/clang/test/SemaTemplate/instantiate-requires-expr.cpp b/clang/test/SemaTemplate/instantiate-requires-expr.cpp index 20a19d731ae1696fc6c015ace6ff14258804d91f..a1f5456156a06f5989c65848a65a9143ec36ad3e 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<bool>); } // namespace GH73885 + +namespace GH84020 { + +struct B { + template <typename S> void foo(); + void bar(); +}; + +template <typename T, typename S> struct A : T { + void foo() { + static_assert(requires { T::template foo<S>(); }); + static_assert(requires { T::bar(); }); + } +}; + +template class A<B, double>; + +} // 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