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">;
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">;
"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<
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;
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
}
}
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
<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>
<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>