[PATCH] Consider unsigned long for non-u/U decimal literals (C90/C++03)

Hubert Tong hubert.reinterpretcast at gmail.com
Thu May 28 23:43:26 PDT 2015


================
Comment at: include/clang/Basic/DiagnosticCommonKinds.td:119
@@ +118,3 @@
+  InGroup<ImplicitlyUnsignedLiteral>;
+def warn_old_implicitly_unsigned_long : Warning<
+  "integer literal is of type unsigned long only when %select{C99|C++11}0 "
----------------
rsmith wrote:
> In C++98, this should probably be an `ExtWarn` rather than a `Warning`, because this case has undefined behavior. Splitting this into two warnings would also allow you to put the warning into `-Wc99-compat` or `-Wc++11-compat` as appropriate, and to indicate that the C++98 case has undefined behavior.
In C++98, the undefined behaviour is only on the case of a decimal integer literal with none of `u`/`U`/`l`/`L`. If the `l`/`L` is present, the choice of `unsigned long` is required to be considered after `long`.

I agree that an `ExtWarn` is appropriate for the undefined behaviour case, but I do not think that the `-Wc99-compat`/`-Wc++11-compat` split still follows.

================
Comment at: include/clang/Basic/DiagnosticCommonKinds.td:120-121
@@ +119,4 @@
+def warn_old_implicitly_unsigned_long : Warning<
+  "integer literal is of type unsigned long only when %select{C99|C++11}0 "
+  "or higher is not enabled">,
+  InGroup<ImplicitlyUnsignedLiteral>;
----------------
rsmith wrote:
> It would be clearer and more useful to phrase this as:
> 
>   "integer literal is too large to be represented in type 'long', interpreting as 'unsigned long'; this literal will have type '%select{long long|unsigned long long}0' in C99 onwards"
> 
> (with s/C99/C++11/ for the C++98 warning.)
> 
> You can easily compute the signedness of the `long long` in SemaExpr by checking if `LongLongSize > LongSize`.
The use of unsigned long long in C99/C++11 modes would also be an extension though. Saying "C99 onwards" implies the Standard, not the mode; so perhaps "in C99-and-later modes"?

http://reviews.llvm.org/D9794

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the cfe-commits mailing list