diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -70,6 +70,9 @@ - We now generate a diagnostic for signed integer overflow due to unary minus in a non-constant expression context. This fixes `Issue 31643 `_ +- Clang now warns by default for C++20 and later about deprecated capture of + ``this`` with a capture default of ``=``. This warning can be disabled with + ``-Wno-deprecated-this-capture``. Non-comprehensive list of changes in this release ------------------------------------------------- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7906,7 +7906,7 @@ "is a C++20 extension">, InGroup; def warn_deprecated_this_capture : Warning< "implicit capture of 'this' with a capture default of '=' is deprecated">, - InGroup, DefaultIgnore; + InGroup; def note_deprecated_this_capture : Note< "add an explicit capture of 'this' to capture '*this' by reference">; diff --git a/clang/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp b/clang/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp --- a/clang/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp +++ b/clang/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only %s -// RUN: %clang_cc1 -std=c++2a -verify -verify=expected-cxx2a -fsyntax-only -fblocks -emit-llvm-only %s +// RUN: %clang_cc1 -std=c++2a -verify -verify=expected-cxx2a -fsyntax-only -fblocks -emit-llvm-only -Wno-deprecated-this-capture %s // RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -emit-llvm-only -triple i386-windows-pc %s -// RUN: %clang_cc1 -std=c++2a -verify -verify=expected-cxx2a -fsyntax-only -fblocks -emit-llvm-only -triple i386-windows-pc %s +// RUN: %clang_cc1 -std=c++2a -verify -verify=expected-cxx2a -fsyntax-only -fblocks -emit-llvm-only -triple i386-windows-pc -Wno-deprecated-this-capture %s // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing %s -DDELAYED_TEMPLATE_PARSING // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fms-extensions %s -DMS_EXTENSIONS // DONTRUNYET: %clang_cc1 -std=c++1y -verify -fsyntax-only -fblocks -fdelayed-template-parsing -fms-extensions %s -DMS_EXTENSIONS -DDELAYED_TEMPLATE_PARSING diff --git a/clang/test/SemaCXX/cxx2a-lambda-equals-this.cpp b/clang/test/SemaCXX/cxx2a-lambda-equals-this.cpp --- a/clang/test/SemaCXX/cxx2a-lambda-equals-this.cpp +++ b/clang/test/SemaCXX/cxx2a-lambda-equals-this.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 -std=c++2a -verify %s -Wdeprecated +// RUN: %clang_cc1 -std=c++2a -verify %s +// expected-no-diagnostics // This test does two things. // Deleting the copy constructor ensures that an [=, this] capture doesn't copy the object. @@ -12,12 +13,3 @@ L(); } }; - -struct B { - int i; - void f() { - (void) [=] { // expected-note {{add an explicit capture of 'this'}} - return i; // expected-warning {{implicit capture of 'this' with a capture default of '=' is deprecated}} - }; - } -}; diff --git a/clang/test/SemaCXX/lambda-implicit-this-capture.cpp b/clang/test/SemaCXX/lambda-implicit-this-capture.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/lambda-implicit-this-capture.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -std=c++11 -verify=cxx11 %s +// RUN: %clang_cc1 -std=c++2a -verify=cxx2a %s +// RUN: %clang_cc1 -std=c++2a -verify=cxx2a-no-deprecated %s -Wno-deprecated +// cxx11-no-diagnostics +// cxx2a-no-deprecated-no-diagnostics + +struct A { + int i; + void f() { + (void) [=] { // cxx2a-note {{add an explicit capture of 'this'}} + return i; // cxx2a-warning {{implicit capture of 'this' with a capture default of '=' is deprecated}} + }; + } +};