Author: Corentin Jabot Date: 2022-11-29T17:15:39+01:00 New Revision: b12aea6659e1170ecbc773a4a363dd0def93daa9
URL: https://github.com/llvm/llvm-project/commit/b12aea6659e1170ecbc773a4a363dd0def93daa9 DIFF: https://github.com/llvm/llvm-project/commit/b12aea6659e1170ecbc773a4a363dd0def93daa9.diff LOG: [Clang] Implement CWG2654: Un-deprecation of compound volatile assignments Reviewed By: #clang-language-wg, erichkeane Differential Revision: https://reviews.llvm.org/D138918 Added: Modified: clang-tools-extra/clangd/Diagnostics.cpp clang/docs/ReleaseNotes.rst clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaExpr.cpp clang/test/CXX/drs/dr26xx.cpp clang/test/SemaCXX/deprecated.cpp clang/www/cxx_dr_status.html Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Diagnostics.cpp b/clang-tools-extra/clangd/Diagnostics.cpp index 031192f763e6e..c0951edcf5258 100644 --- a/clang-tools-extra/clangd/Diagnostics.cpp +++ b/clang-tools-extra/clangd/Diagnostics.cpp @@ -331,7 +331,6 @@ void setTags(clangd::Diag &D) { diag::warn_deprecated, diag::warn_deprecated_altivec_src_compat, diag::warn_deprecated_comma_subscript, - diag::warn_deprecated_compound_assign_volatile, diag::warn_deprecated_copy, diag::warn_deprecated_copy_with_dtor, diag::warn_deprecated_copy_with_user_provided_copy, diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 551070b27b2da..0e57feb6e085b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -607,6 +607,8 @@ C++ Language Changes in Clang conforming GNU extensions. Projects incompatible with C++17 can add ``-std=gnu++14`` to their build settings to restore the previous behaviour. - Implemented DR2358 allowing init captures in lambdas in default arguments. +- implemented `DR2654 <https://wg21.link/cwg2654>`_ which undeprecates + all compound assignements operations on volatile qualified variables. C++20 Feature Support ^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 84ce58c69848c..15f85b778ccc6 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7627,9 +7627,6 @@ def warn_deprecated_increment_decrement_volatile : Warning< def warn_deprecated_simple_assign_volatile : Warning< "use of result of assignment to object of volatile-qualified type %0 " "is deprecated">, InGroup<DeprecatedVolatile>; -def warn_deprecated_compound_assign_volatile : Warning< - "compound assignment to object of volatile-qualified type %0 is deprecated">, - InGroup<DeprecatedVolatile>; def warn_deprecated_volatile_return : Warning< "volatile-qualified return type %0 is deprecated">, InGroup<DeprecatedVolatile>; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 1ba88ad6cc2a6..06c70fbba6ffa 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -13982,19 +13982,6 @@ QualType Sema::CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, // type is deprecated unless the assignment is either a discarded-value // expression or an unevaluated operand ExprEvalContexts.back().VolatileAssignmentLHSs.push_back(LHSExpr); - } else { - // C++20 [expr.ass]p6: - // [Compound-assignment] expressions are deprecated if E1 has - // volatile-qualified type and op is not one of the bitwise - // operators |, &, ˆ. - switch (Opc) { - case BO_OrAssign: - case BO_AndAssign: - case BO_XorAssign: - break; - default: - Diag(Loc, diag::warn_deprecated_compound_assign_volatile) << LHSType; - } } } diff --git a/clang/test/CXX/drs/dr26xx.cpp b/clang/test/CXX/drs/dr26xx.cpp index 46d81e544b5c2..6aa0e5053bc9a 100644 --- a/clang/test/CXX/drs/dr26xx.cpp +++ b/clang/test/CXX/drs/dr26xx.cpp @@ -78,3 +78,13 @@ class X { }; int i0 = f<X>(0); //expected-error {{no matching function for call to 'f'}} } + +namespace dr2654 { // dr2654: 16 +void f() { + int neck, tail; + volatile int brachiosaur; + brachiosaur += neck; // OK + brachiosaur -= neck; // OK + brachiosaur |= neck; // OK +} +} diff --git a/clang/test/SemaCXX/deprecated.cpp b/clang/test/SemaCXX/deprecated.cpp index 0c2eaaa53ca64..a93331023f7e2 100644 --- a/clang/test/SemaCXX/deprecated.cpp +++ b/clang/test/SemaCXX/deprecated.cpp @@ -186,10 +186,10 @@ namespace DeprecatedVolatile { --n; // cxx20-warning {{decrement of object of volatile-qualified type 'volatile int' is deprecated}} n++; // cxx20-warning {{increment of object of volatile-qualified type 'volatile int' is deprecated}} n--; // cxx20-warning {{decrement of object of volatile-qualified type 'volatile int' is deprecated}} - n += 5; // cxx20-warning {{compound assignment to object of volatile-qualified type 'volatile int' is deprecated}} - n *= 3; // cxx20-warning {{compound assignment to object of volatile-qualified type 'volatile int' is deprecated}} - n /= 2; // cxx20-warning {{compound assignment to object of volatile-qualified type 'volatile int' is deprecated}} - n %= 42; // cxx20-warning {{compound assignment to object of volatile-qualified type 'volatile int' is deprecated}} + n += 5; // undeprecated as a DR in C++23 + n *= 3; // undeprecated as a DR in C++23 + n /= 2; // undeprecated as a DR in C++23 + n %= 42; // undeprecated as a DR in C++23 n &= 2; // undeprecated as a DR in C++23 n |= 2; // undeprecated as a DR in C++23 n ^= 2; // undeprecated as a DR in C++23 diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index 678c91313a47e..cec9fe58cf601 100755 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -15732,7 +15732,7 @@ <h2 id="cxxdr">C++ defect report implementation status</h2> <td><a href="https://wg21.link/cwg2654">2654</a></td> <td>DR</td> <td>Un-deprecation of compound volatile assignments</td> - <td class="none" align="center">Unknown</td> + <td class="unreleased" align="center">Clang 16</td> </tr></table> </div> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits