Add warning Wenum-conversion for C and ObjC.
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Wed, 4 Sep 2019 16:25:21 +0000 (16:25 +0000)
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>
Wed, 4 Sep 2019 16:25:21 +0000 (16:25 +0000)
The patch enables warning with Wextra due to PR91593 and warnings with
allmodconfig kernel build. Once these issues are resolved, we could
consider promoting it to Wall.

2019-09-04  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

PR c/78736
* doc/invoke.texi: Document -Wenum-conversion.

c-family
* c.opt (Wenum-conversion): New option.

c/
* c-typeck.c (convert_for_assignment): Handle Wenum-conversion.

testsuite/
* gcc.dg/Wenum-conversion.c: New test-case.

From-SVN: r275376

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wenum-conversion.c [new file with mode: 0644]

index fa47927e47f4d2fec83d3d7d7f0c335999b24735..fc187665099ac716d441d5a9dbda154c0013761e 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-04  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       PR c/78736
+       * doc/invoke.texi: Document -Wenum-conversion.
+
 2019-09-04  Richard Biener  <rguenther@suse.de>
 
        PR rtl-optimization/36262
index 9ca5a1e6a4fe9753d0356d4b335c9ecc6fe30fa7..ecdaaeba645c8a27002a3c2926f4ddd032d9f5af 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-04  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       PR c/78736
+       * c.opt (Wenum-conversion): New option.
+
 2019-09-03  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * c-attribs.c (handle_section_attribute): Call the
index f8a1a1dbdad90dda1dc4fe401e90603f285b0f0b..38a8e7d1d12af5e1b7b8739130fedb2d26dea215 100644 (file)
@@ -541,6 +541,10 @@ Wenum-compare
 C ObjC C++ ObjC++ Var(warn_enum_compare) Init(-1) Warning LangEnabledBy(C ObjC,Wall || Wc++-compat)
 Warn about comparison of different enum types.
 
+Wenum-conversion
+C ObjC Var(warn_enum_conversion) Init(0) Warning LangEnabledBy(C ObjC,Wextra)
+Warn about implicit conversion of enum types.
+
 Werror
 C ObjC C++ ObjC++
 ; Documented in common.opt
index b7b45f504a1c65bbc15a163295832a9797a33f92..285ea1871003adb7bf598f1d906e342394b9f8a9 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-04  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       PR c/78736
+       * c-typeck.c (convert_for_assignment): Handle Wenum-conversion.
+
 2019-08-23  Iain Sandoe  <iain@sandoe.co.uk>
 
        PR pch/61250
index 2bbf0e21fb9a1cecf55b820b1ca1324b09827a16..d4e12eb93d1d2d774ed4f5964d5434e18d4109ae 100644 (file)
@@ -6726,6 +6726,21 @@ convert_for_assignment (location_t location, location_t expr_loc, tree type,
          }
     }
 
+  if (warn_enum_conversion)
+    {
+      tree checktype = origtype != NULL_TREE ? origtype : rhstype;
+      if (checktype != error_mark_node
+         && TREE_CODE (checktype) == ENUMERAL_TYPE
+         && TREE_CODE (type) == ENUMERAL_TYPE
+         && TYPE_MAIN_VARIANT (checktype) != TYPE_MAIN_VARIANT (type))
+       {
+         gcc_rich_location loc (location);
+         warning_at (&loc, OPT_Wenum_conversion,
+                     "implicit conversion from %qT to %qT",
+                     checktype, type);
+       }
+    }
+
   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
     {
       warn_for_address_or_pointer_of_packed_member (type, orig_rhs);
index 2e353be433c81146af97578787b14d770cf03446..34d07463e2322a1264736ddcba3de229898481cb 100644 (file)
@@ -307,7 +307,8 @@ Objective-C and Objective-C++ Dialects}.
 -Wno-discarded-qualifiers  -Wno-discarded-array-qualifiers @gol
 -Wno-div-by-zero  -Wdouble-promotion @gol
 -Wduplicated-branches  -Wduplicated-cond @gol
--Wempty-body  -Wenum-compare  -Wno-endif-labels  -Wexpansion-to-defined @gol
+-Wempty-body  -Wenum-compare  -Wenum-conversion @gol
+-Wno-endif-labels  -Wexpansion-to-defined @gol
 -Werror  -Werror=*  -Wextra-semi  -Wfatal-errors @gol
 -Wfloat-equal  -Wformat  -Wformat=2 @gol
 -Wno-format-contains-nul  -Wno-format-extra-args  @gol
@@ -4434,6 +4435,7 @@ Options} and @ref{Objective-C and Objective-C++ Dialect Options}.
 -Wcomment  @gol
 -Wduplicate-decl-specifier @r{(C and Objective-C only)} @gol
 -Wenum-compare @r{(in C/ObjC; this is on by default in C++)} @gol
+-Wenum-conversion @r{in C/ObjC;} @gol
 -Wformat   @gol
 -Wint-in-bool-context  @gol
 -Wimplicit @r{(C and Objective-C only)} @gol
@@ -7012,6 +7014,12 @@ In C++ enumerated type mismatches in conditional expressions are also
 diagnosed and the warning is enabled by default.  In C this warning is 
 enabled by @option{-Wall}.
 
+@item -Wenum-conversion @r{(C, Objective-C only)}
+@opindex Wenum-conversion
+@opindex Wno-enum-conversion
+Warn when a value of enumerated type is implicitly converted to a 
+different enumerated type.  This warning is enabled by @option{-Wextra}.
+
 @item -Wextra-semi @r{(C++, Objective-C++ only)}
 @opindex Wextra-semi
 @opindex Wno-extra-semi
index 7c9a9c92fd650927d350ea0456c5ff4b3ca399a9..5b6332a6a000b5f36200f24da32da2ff4252d05c 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-04  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
+
+       PR c/78736
+       * gcc.dg/Wenum-conversion.c: New test-case.
+
 2019-09-03  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * gcc.target/msp430/data-attributes-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/Wenum-conversion.c b/gcc/testsuite/gcc.dg/Wenum-conversion.c
new file mode 100644 (file)
index 0000000..8603339
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-Wenum-conversion" } */
+
+enum X { x1, x2 };
+enum Y { y1, y2 };
+
+enum X obj = y1;  /* { dg-warning "implicit conversion from .enum Y. to .enum X." } */
+enum Y obj2 = y1;
+
+enum X obj3;
+void foo()
+{
+  obj3 = y2; /* { dg-warning "implicit conversion from .enum Y. to .enum X." } */
+}
+
+void bar(enum X);
+void f(void)
+{
+  bar (y1); /* { dg-warning "implicit conversion from .enum Y. to .enum X." } */
+}