]> granicus.if.org Git - clang/commitdiff
P0002R1: increment on expressions of type bool is no longer allowed in C++1z.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 26 Nov 2015 02:16:37 +0000 (02:16 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 26 Nov 2015 02:16:37 +0000 (02:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@254122 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/CXX/drs/dr1xx.cpp
test/SemaCXX/deprecated.cpp
www/cxx_status.html

index 8be6c5ee0298c487a4e0230c2b868c17b9b2bf0b..64add07b1737d3068c6505db1b8470d86d1bc5f6 100644 (file)
@@ -187,7 +187,8 @@ def CXX14Compat : DiagGroup<"c++14-compat", [CXXPre1zCompat]>;
 def CXX14CompatPedantic : DiagGroup<"c++14-compat-pedantic",
                                     [CXXPre1zCompatPedantic]>;
 
-def CXX1zCompat : DiagGroup<"c++1z-compat", [DeprecatedRegister]>;
+def CXX1zCompat : DiagGroup<"c++1z-compat", [DeprecatedRegister,
+                                             DeprecatedIncrementBool]>;
 
 def : DiagGroup<"effc++">;
 def DivZero : DiagGroup<"division-by-zero">;
@@ -204,6 +205,7 @@ def DanglingElse: DiagGroup<"dangling-else">;
 def DanglingField : DiagGroup<"dangling-field">;
 def DistributedObjectModifiers : DiagGroup<"distributed-object-modifiers">;
 def FlagEnum : DiagGroup<"flag-enum">;
+def IncrementBool : DiagGroup<"increment-bool", [DeprecatedIncrementBool]>;
 def InfiniteRecursion : DiagGroup<"infinite-recursion">;
 def GNUImaginaryConstant : DiagGroup<"gnu-imaginary-constant">;
 def IgnoredQualifiers : DiagGroup<"ignored-qualifiers">;
index 91ccf77487ecb69162a0f18f9b300f2b2a8bb02a..9585110f96739611eba2c02be2edf3a72df027fe 100644 (file)
@@ -5727,8 +5727,11 @@ def note_member_declared_here : Note<
   "member %0 declared here">;
 def err_decrement_bool : Error<"cannot decrement expression of type bool">;
 def warn_increment_bool : Warning<
-  "incrementing expression of type bool is deprecated">,
-  InGroup<DeprecatedIncrementBool>;
+  "incrementing expression of type bool is deprecated and "
+  "incompatible with C++1z">, InGroup<DeprecatedIncrementBool>;
+def ext_increment_bool : ExtWarn<
+  "ISO C++1z does not allow incrementing expression of type bool">,
+  DefaultError, InGroup<IncrementBool>;
 def err_increment_decrement_enum : Error<
   "cannot %select{decrement|increment}0 expression of enum type %1">;
 def err_catch_incomplete_ptr : Error<
index 20f1bdbf5e18bc9c04d5e3c1a11f51349157cc8a..3481f73e693be7c7002e7d4c18e1fd59cf75c89c 100644 (file)
@@ -9680,7 +9680,9 @@ static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op,
       return QualType();
     }
     // Increment of bool sets it to true, but is deprecated.
-    S.Diag(OpLoc, diag::warn_increment_bool) << Op->getSourceRange();
+    S.Diag(OpLoc, S.getLangOpts().CPlusPlus1z ? diag::ext_increment_bool
+                                              : diag::warn_increment_bool)
+      << Op->getSourceRange();
   } else if (S.getLangOpts().CPlusPlus && ResType->isEnumeralType()) {
     // Error on enum increments and decrements in C++ mode
     S.Diag(OpLoc, diag::err_increment_decrement_enum) << IsInc << ResType;
index 377bfc94ffa2cc625553ceff4535fbabf98b30d2..47d1494ec7a3c41f7f14c8cb19d16407fbb06852 100644 (file)
@@ -524,8 +524,13 @@ namespace dr143 { // dr143: yes
 
 namespace dr145 { // dr145: yes
   void f(bool b) {
+#if __cplusplus <= 201402L
     ++b; // expected-warning {{deprecated}}
     b++; // expected-warning {{deprecated}}
+#else
+    ++b; // expected-error {{increment}}
+    b++; // expected-error {{increment}}
+#endif
   }
 }
 
index 732c015e78b2334785c44e2ef29bec75cca30d4c..4ce0589687421add3af88f30e4e0851e95fc1de3 100644 (file)
@@ -28,7 +28,19 @@ void stuff() {
 
   int k = to_int(n); // no-warning
   bool b;
-  ++b; // expected-warning {{incrementing expression of type bool is deprecated}}
+  ++b;
+#if __cplusplus > 201402L
+  // expected-error@-2 {{ISO C++1z does not allow incrementing expression of type bool}}
+#else
+  // expected-warning@-4 {{incrementing expression of type bool is deprecated}}
+#endif
+
+  b++;
+#if __cplusplus > 201402L
+  // expected-error@-2 {{ISO C++1z does not allow incrementing expression of type bool}}
+#else
+  // expected-warning@-4 {{incrementing expression of type bool is deprecated}}
+#endif
 
   char *p = "foo";
 #if __cplusplus < 201103L
index c41f1196fe5a46f5503d54a030815cbf8a849b00..2e9c2985e095cd0a0519b380bb8aff88adca550b 100644 (file)
@@ -601,7 +601,7 @@ as the draft C++1z standard evolves.</p>
     <tr>
       <td>Remove deprecated <tt>bool</tt> increment</td>
       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0002r1.html">P0002R1</a></td>
-      <td class="none" align="center">No</td>
+      <td class="svn" align="center">Clang 3.8</td>
     </tr>
     <tr>
       <td>Make exception specifications part of the type system</td>
@@ -609,7 +609,7 @@ as the draft C++1z standard evolves.</p>
       <td class="none" align="center">No</td>
     </tr>
     <tr>
-      <td><tt>__has_include</tt></td>
+      <td><tt>__has_include</tt> in preprocessor conditionals</td>
       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0061.html">P0061R1</a></td>
       <td class="full" align="center">Yes</td>
     </tr>