From ecd0be100bed5bae1f22d3da28bfcca89934af8c Mon Sep 17 00:00:00 2001 From: Tom Honermann Date: Thu, 26 Jan 2023 07:32:27 -0800 Subject: [PATCH] [clang] Warn by default that implicit capture of 'this' is deprecated in C++20 and later. Previously, a warning that C++20 deprecated implicit capture of 'this' for lambda captures specified with a capture default of '=' was only issued when '-Wdeprecated' or '-Wdeprecated-this-capture' was specified. This change enables the warning by default (it is still only issued when compiling for C++20 or later). This is consistent with gcc which warns by default (MSVC requires '/Wall'). Reviewed By: erichkeane, shafik Differential Revision: https://reviews.llvm.org/D142639 --- clang/docs/ReleaseNotes.rst | 3 +++ clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp | 4 ++-- clang/test/SemaCXX/cxx2a-lambda-equals-this.cpp | 12 ++---------- clang/test/SemaCXX/lambda-implicit-this-capture.cpp | 14 ++++++++++++++ 5 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 clang/test/SemaCXX/lambda-implicit-this-capture.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 8e93be1..3f1f492 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -70,6 +70,9 @@ Improvements to Clang's diagnostics - 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 index 6d6f474..7944b86 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7906,7 +7906,7 @@ let CategoryName = "Lambda Issue" in { "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 index 28af623..e9e2eca 100644 --- 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 index 652fb8d..ce69163 100644 --- 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 @@ class A { 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 index 0000000..7e0e347a --- /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}} + }; + } +}; -- 2.7.4