re PR c++/82299 (-Wuseless-cast errors on typed enums used in member data initializer...
authorJakub Jelinek <jakub@redhat.com>
Fri, 6 Oct 2017 15:50:50 +0000 (17:50 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 6 Oct 2017 15:50:50 +0000 (17:50 +0200)
PR c++/82299
* decl.c (reshape_init): Suppress warn_useless_cast for direct enum
init.
* typeck.c (convert_for_assignment): Likewise.

* g++.dg/cpp0x/pr82299.C: New test.

From-SVN: r253495

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr82299.C [new file with mode: 0644]

index e41576dddeb8c395eb9384f65f6511ce34e26d48..ea0e8b6f9c808fe53d43865b431f0f7c912c8308 100644 (file)
@@ -1,5 +1,10 @@
 2017-10-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/82299
+       * decl.c (reshape_init): Suppress warn_useless_cast for direct enum
+       init.
+       * typeck.c (convert_for_assignment): Likewise.
+
        P0704R1 - fixing const-qualified pointers to members
        * typeck2.c (build_m_component_ref): For -std=c++2a allow
        pointer to const & qualified method on rvalue.
index 7c68f68b9bdbfa1857f4a05c18d06ec7e22abcdd..6f36aa1a496328909e2f650ccebccbf7b2924e0e 100644 (file)
@@ -6047,7 +6047,10 @@ reshape_init (tree type, tree init, tsubst_flags_t complain)
       tree elt = CONSTRUCTOR_ELT (init, 0)->value;
       type = cv_unqualified (type);
       if (check_narrowing (ENUM_UNDERLYING_TYPE (type), elt, complain))
-       return cp_build_c_cast (type, elt, tf_warning_or_error);
+       {
+         warning_sentinel w (warn_useless_cast);
+         return cp_build_c_cast (type, elt, tf_warning_or_error);
+       }
       else
        return error_mark_node;
     }
index 326721eb5e0690e781a2995ae74d2fa7189300c9..c3310db7b3b68d7ae7e8721b1b9895ef8e178727 100644 (file)
@@ -8527,7 +8527,10 @@ convert_for_assignment (tree type, tree rhs,
     {
       tree elt = CONSTRUCTOR_ELT (rhs, 0)->value;
       if (check_narrowing (ENUM_UNDERLYING_TYPE (type), elt, complain))
-       rhs = cp_build_c_cast (type, elt, complain);
+       {
+         warning_sentinel w (warn_useless_cast);
+         rhs = cp_build_c_cast (type, elt, complain);
+       }
       else
        rhs = error_mark_node;
     }
index 7432a3a46e880c54083c25f348da3fb3c7db7a4b..d7af2a93b5a42a129a8a27385d6357c840092614 100644 (file)
@@ -1,5 +1,8 @@
 2017-10-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/82299
+       * g++.dg/cpp0x/pr82299.C: New test.
+
        P0704R1 - fixing const-qualified pointers to members
        * g++.dg/cpp2a/ptrmem1.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr82299.C b/gcc/testsuite/g++.dg/cpp0x/pr82299.C
new file mode 100644 (file)
index 0000000..27f4c5f
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/82299
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wuseless-cast" }
+
+enum Enum : char { A = 0, B = 1 };
+
+struct S {
+  Enum e { Enum::A };  // { dg-bogus "useless cast to type" }
+};