From c64c550605f9102c952f12b4594f7399d204ae0d Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Mon, 13 Oct 2025 14:28:59 -0400 Subject: [PATCH 1/4] [Clang][Sema] Use correct DeclContext when checking 'this' --- clang/lib/Sema/SemaExprCXX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 0fe242dce45e9..9fa5e6ecdee2c 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1426,7 +1426,7 @@ bool Sema::CheckCXXThisType(SourceLocation Loc, QualType Type) { const auto *Method = dyn_cast(DC); if (Method && Method->isExplicitObjectMemberFunction()) { Diag(Loc, diag::err_invalid_this_use) << 1; - } else if (Method && isLambdaCallWithExplicitObjectParameter(CurContext)) { + } else if (Method && isLambdaCallWithExplicitObjectParameter(DC)) { Diag(Loc, diag::err_invalid_this_use) << 1; } else { Diag(Loc, diag::err_invalid_this_use) << 0; From bd083b21aa7e4ab3ecdc3f0daf2173a1f7f9d957 Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Mon, 13 Oct 2025 15:03:12 -0400 Subject: [PATCH 2/4] [FOLD] add tests --- .../CXX/expr/expr.prim/expr.prim.this/p4.cpp | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp new file mode 100644 index 0000000000000..85e34112895a5 --- /dev/null +++ b/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s + +namespace N0 { + struct A { + static void f() { + []() -> decltype(this) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} + } + }; +} // namespace N0 + +namespace N1 { + struct A { + static void f() { + []() noexcept(decltype(this)()) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} + } + }; +} // namespace N1 + +namespace N2 { + struct A { + static void f() { + [](this auto&&) -> decltype(this) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} + } + }; +} // namespace N2 + +namespace N3 { + struct A { + static void f() { + [](this auto&&) noexcept(decltype(this)()) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} + } + }; +} // namespace N3 + +namespace N4 { + struct A { + void f() { + []() -> decltype(this) { }; + } + }; +} // namespace N4 + +namespace N5 { + struct A { + void f() { + []() noexcept(decltype(this)()) { }; // expected-error{{conversion from 'decltype(this)' (aka 'N5::A *') to 'bool' is not allowed in a converted constant expression}} + } + }; +} // namespace N5 + +namespace N6 { + struct A { + void f() { + [](this auto&&) -> decltype(this) { }; + } + }; +} // namespace N6 + +namespace N7 { + struct A { + void f() { + [](this auto&&) noexcept(decltype(this)()) { }; // expected-error{{conversion from 'decltype(this)' (aka 'N7::A *') to 'bool' is not allowed in a converted constant expression}} + } + }; +} // namespace N7 From f9c6583840256a34c5c1c543a98a34bc93845fe0 Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Tue, 14 Oct 2025 13:01:00 -0400 Subject: [PATCH 3/4] fix tests --- clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp index 85e34112895a5..5d44bac4929a7 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++23 -fsyntax-only -Wno-unused-value -verify %s namespace N0 { struct A { From d824f5fc0bc545b48ab06ffbac0bd71d7f1f0333 Mon Sep 17 00:00:00 2001 From: Krystian Stasiowski Date: Tue, 14 Oct 2025 16:45:18 -0400 Subject: [PATCH 4/4] [FOLD] fix whitespace --- clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp index 5d44bac4929a7..adba5deeef40f 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.this/p4.cpp @@ -2,17 +2,17 @@ namespace N0 { struct A { - static void f() { - []() -> decltype(this) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} - } + static void f() { + []() -> decltype(this) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} + } }; } // namespace N0 namespace N1 { struct A { - static void f() { - []() noexcept(decltype(this)()) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} - } + static void f() { + []() noexcept(decltype(this)()) { }; // expected-error{{invalid use of 'this' outside of a non-static member function}} + } }; } // namespace N1