r366630 - [c++20] P1161R3: a[b,c] is deprecated.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 20 02:32:27 PDT 2019


Author: rsmith
Date: Sat Jul 20 02:32:27 2019
New Revision: 366630

URL: http://llvm.org/viewvc/llvm-project?rev=366630&view=rev
Log:
[c++20] P1161R3: a[b,c] is deprecated.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticGroups.td
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/test/SemaCXX/deprecated.cpp
    cfe/trunk/www/cxx_status.html

Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=366630&r1=366629&r2=366630&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Sat Jul 20 02:32:27 2019
@@ -118,6 +118,7 @@ def CXX11CompatDeprecatedWritableStr :
   DiagGroup<"c++11-compat-deprecated-writable-strings">;
 
 def DeprecatedAttributes : DiagGroup<"deprecated-attributes">;
+def DeprecatedCommaSubscript : DiagGroup<"deprecated-comma-subscript">;
 def DeprecatedDeclarations : DiagGroup<"deprecated-declarations">;
 def UnavailableDeclarations : DiagGroup<"unavailable-declarations">;
 def UnguardedAvailabilityNew : DiagGroup<"unguarded-availability-new">;
@@ -135,6 +136,7 @@ def DeprecatedWritableStr : DiagGroup<"d
                                       [CXX11CompatDeprecatedWritableStr]>;
 // FIXME: Why is DeprecatedImplementations not in this group?
 def Deprecated : DiagGroup<"deprecated", [DeprecatedAttributes,
+                                          DeprecatedCommaSubscript,
                                           DeprecatedDeclarations,
                                           DeprecatedDynamicExceptionSpec,
                                           DeprecatedIncrementBool,

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=366630&r1=366629&r2=366630&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sat Jul 20 02:32:27 2019
@@ -5719,6 +5719,9 @@ def err_arithmetic_nonfragile_interface
   "arithmetic on pointer to interface %0, which is not a constant size for "
   "this architecture and platform">;
 
+def warn_deprecated_comma_subscript : Warning<
+  "top-level comma expression in array subscript is deprecated">,
+  InGroup<DeprecatedCommaSubscript>;
 
 def ext_subscript_non_lvalue : Extension<
   "ISO C90 does not allow subscripting non-lvalue array">;

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=366630&r1=366629&r2=366630&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat Jul 20 02:32:27 2019
@@ -4317,6 +4317,15 @@ Sema::ActOnArraySubscriptExpr(Scope *S,
     base = result.get();
   }
 
+  // A comma-expression as the index is deprecated in C++2a onwards.
+  if (getLangOpts().CPlusPlus2a &&
+      ((isa<BinaryOperator>(idx) && cast<BinaryOperator>(idx)->isCommaOp()) ||
+       (isa<CXXOperatorCallExpr>(idx) &&
+        cast<CXXOperatorCallExpr>(idx)->getOperator() == OO_Comma))) {
+    Diag(idx->getExprLoc(), diag::warn_deprecated_comma_subscript)
+      << SourceRange(base->getBeginLoc(), rbLoc);
+  }
+
   // Handle any non-overload placeholder types in the base and index
   // expressions.  We can't handle overloads here because the other
   // operand might be an overloadable type, in which case the overload

Modified: cfe/trunk/test/SemaCXX/deprecated.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/deprecated.cpp?rev=366630&r1=366629&r2=366630&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/deprecated.cpp (original)
+++ cfe/trunk/test/SemaCXX/deprecated.cpp Sat Jul 20 02:32:27 2019
@@ -2,6 +2,7 @@
 // RUN: %clang_cc1 -std=c++11 %s -Wdeprecated -verify -triple x86_64-linux-gnu
 // RUN: %clang_cc1 -std=c++14 %s -Wdeprecated -verify -triple x86_64-linux-gnu
 // RUN: %clang_cc1 -std=c++17 %s -Wdeprecated -verify -triple x86_64-linux-gnu
+// RUN: %clang_cc1 -std=c++2a %s -Wdeprecated -verify -triple x86_64-linux-gnu
 
 // RUN: %clang_cc1 -std=c++14 %s -Wdeprecated -verify -triple x86_64-linux-gnu -Wno-deprecated-register -DNO_DEPRECATED_FLAGS
 
@@ -99,5 +100,30 @@ namespace DeprecatedCopy {
 }
 #endif
 
+struct X {
+  friend int operator,(X, X);
+  void operator[](int);
+};
+void array_index_comma() {
+  int arr[123];
+  (void)arr[(void)1, 2];
+  (void)arr[X(), X()];
+  X()[(void)1, 2];
+  X()[X(), X()];
+#if __cplusplus > 201703L
+  // expected-warning at -5 {{deprecated}}
+  // expected-warning at -5 {{deprecated}}
+  // expected-warning at -5 {{deprecated}}
+  // expected-warning at -5 {{deprecated}}
+#endif
+
+  (void)arr[((void)1, 2)];
+  (void)arr[(X(), X())];
+  (void)((void)1,2)[arr];
+  (void)(X(), X())[arr];
+  X()[((void)1, 2)];
+  X()[(X(), X())];
+}
+
 # 1 "/usr/include/system-header.h" 1 3
 void system_header_function(void) throw();

Modified: cfe/trunk/www/cxx_status.html
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=366630&r1=366629&r2=366630&view=diff
==============================================================================
--- cfe/trunk/www/cxx_status.html (original)
+++ cfe/trunk/www/cxx_status.html Sat Jul 20 02:32:27 2019
@@ -1098,7 +1098,7 @@ as the draft C++2a standard evolves.
     <tr>
       <td>Deprecate <tt>a[b,c]</tt></td>
       <td><a href="http://wg21.link/p1161r3">P1161R3</a></td>
-      <td class="none" align="center">No</td>
+      <td class="svn" align="center">SVN</td>
     </tr>
     <tr>
       <td>Deprecate some problematic uses of <tt>volatile</tt></td>




More information about the cfe-commits mailing list