Implement -Wlong-long.
authorChristoph Mallon <christoph.mallon@gmx.de>
Mon, 25 Aug 2008 07:42:30 +0000 (07:42 +0000)
committerChristoph Mallon <christoph.mallon@gmx.de>
Mon, 25 Aug 2008 07:42:30 +0000 (07:42 +0000)
[r21429]

parser.c
warning.c
warning.h

index 38dffce..e640591 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -3274,17 +3274,24 @@ finish_specifiers:
                case SPECIFIER_UNSIGNED | SPECIFIER_LONG | SPECIFIER_INT:
                        atomic_type = ATOMIC_TYPE_ULONG;
                        break;
+
                case SPECIFIER_LONG | SPECIFIER_LONG_LONG:
                case SPECIFIER_SIGNED | SPECIFIER_LONG | SPECIFIER_LONG_LONG:
                case SPECIFIER_LONG | SPECIFIER_LONG_LONG | SPECIFIER_INT:
                case SPECIFIER_SIGNED | SPECIFIER_LONG | SPECIFIER_LONG_LONG
                        | SPECIFIER_INT:
                        atomic_type = ATOMIC_TYPE_LONGLONG;
-                       break;
+                       goto warn_about_long_long;
+
                case SPECIFIER_UNSIGNED | SPECIFIER_LONG | SPECIFIER_LONG_LONG:
                case SPECIFIER_UNSIGNED | SPECIFIER_LONG | SPECIFIER_LONG_LONG
                        | SPECIFIER_INT:
                        atomic_type = ATOMIC_TYPE_ULONGLONG;
+warn_about_long_long:
+                       if (warning.long_long) {
+                               warningf(&specifiers->source_position,
+                                        "ISO C90 does not support 'long long'");
+                       }
                        break;
 
                case SPECIFIER_UNSIGNED | SPECIFIER_INT8:
index a5880ce..a25cb0b 100644 (file)
--- a/warning.c
+++ b/warning.c
@@ -32,6 +32,7 @@ warning_t warning = {
        .format                        = true,
        .implicit_function_declaration = true,
        .implicit_int                  = true,
+       .long_long                     = false,
        .main                          = true,
        .missing_declarations          = false,
        .missing_prototypes            = false,
@@ -120,6 +121,7 @@ void set_warning_opt(const char *const opt)
        }
        OPT("implicit-function-declaration", implicit_function_declaration);
        OPT("implicit-int",                  implicit_int);
+       OPT("long-long",                     long_long);
        OPT("main",                          main);
        OPT("missing-declarations",          missing_declarations);
        OPT("missing-prototypes",            missing_prototypes);
index e36d630..da1815a 100644 (file)
--- a/warning.h
+++ b/warning.h
@@ -53,8 +53,8 @@ typedef struct warning_t {
        bool implicit_int:1;                  /**< Warn when a declaration does not specify a type */
 #if 0 // TODO
        bool inline:1;                        /**< Warn if a function can not be inlined and it was declared as inline */
-       bool long_long:1;                     /**< Warn if 'long long' type is used */
 #endif
+       bool long_long:1;                     /**< Warn if 'long long' type is used */
        bool main:1;                          /**< Warn if the type of 'main' is suspicious */
 #if 0 // TODO
        bool missing_braces:1;                /**< Warn if an aggregate or union initializer is not fully bracketed */