re PR c++/49577 ([C++0x] narrowing conversion not rejected)
authorJason Merrill <jason@redhat.com>
Tue, 2 Aug 2011 21:09:17 +0000 (17:09 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 2 Aug 2011 21:09:17 +0000 (17:09 -0400)
PR c++/49577
* typeck2.c (check_narrowing): Check unsigned mismatch.
* semantics.c (finish_compound_literal): check_narrowing.

From-SVN: r177215

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist5.C
gcc/testsuite/g++.dg/opt/range-test-1.C

index 28900c87ce88a80bc47d703e2e367892a9a353d3..4e64f1bae1d8b2d3796342ed307816c5737b8b14 100644 (file)
@@ -1,5 +1,9 @@
 2011-08-02  Jason Merrill  <jason@redhat.com>
 
+       PR c++/49577
+       * typeck2.c (check_narrowing): Check unsigned mismatch.
+       * semantics.c (finish_compound_literal): check_narrowing.
+
        PR c++/49593
        * pt.c (find_parameter_packs_r): Handle CONSTRUCTOR.
 
index a52847733e63f644d6950687bf8648613160011d..ac24b779dd223571d6f81e7bfa50c78bc78cbf58 100644 (file)
@@ -2379,6 +2379,9 @@ finish_compound_literal (tree type, tree compound_literal,
       && check_array_initializer (NULL_TREE, type, compound_literal))
     return error_mark_node;
   compound_literal = reshape_init (type, compound_literal, complain);
+  if (cxx_dialect >= cxx0x && SCALAR_TYPE_P (type)
+      && !BRACE_ENCLOSED_INITIALIZER_P (compound_literal))
+    check_narrowing (type, compound_literal);
   if (TREE_CODE (type) == ARRAY_TYPE
       && TYPE_DOMAIN (type) == NULL_TREE)
     {
index 727a88bd363ab64ce5b1869fec2a0bdf00adcfcd..c6b8c443757b5c76af5b4da683d16340b9fa604c 100644 (file)
@@ -740,7 +740,8 @@ check_narrowing (tree type, tree init)
   else if (INTEGRAL_OR_ENUMERATION_TYPE_P (ftype)
           && CP_INTEGRAL_TYPE_P (type))
     {
-      if (TYPE_PRECISION (type) < TYPE_PRECISION (ftype)
+      if ((TYPE_PRECISION (type) < TYPE_PRECISION (ftype)
+          || TYPE_UNSIGNED (type) != TYPE_UNSIGNED (ftype))
          && (TREE_CODE (init) != INTEGER_CST
              || !int_fits_type_p (init, type)))
        ok = false;
index 884162de8544d246203182baa60c410f201b74ec..6e91668b990611a5cd9e02faae5299b23cc67505 100644 (file)
@@ -1,5 +1,8 @@
 2011-08-02  Jason Merrill  <jason@redhat.com>
 
+       PR c++/49577
+       * g++.dg/cpp0x/initlist5.C: Add additional cases.
+
        PR c++/49593
        * g++.dg/cpp0x/variadic115.C: New.
 
index dbd17ecbbe29ba170b976a236b3b88809c623131..c5ba87d55f1eb0102cf6590c4fd204180b29da73 100644 (file)
@@ -25,3 +25,7 @@ double d = 1.1;
 float fa[] = { d, 1.1 };      // { dg-error "narrowing conversion of 'd'" }
 constexpr double d2 = 1.1;
 float fa2[] = { d2, 1.1 };
+
+// PR c++/49577
+unsigned u{ -1 };              // { dg-error "narrowing" }
+char c = char{ u };            // { dg-error "narrowing" }
index cc5ba6694798a6e208ba7816e4a44299f7e45553..9015147b2c9da2c9bea50766831184bb7e51e197 100644 (file)
@@ -156,7 +156,7 @@ T(16, int, x == -3 || x == -4 || x == -5,
   { -3 C -4 C -5 }, { -6 C -7 C -8 C -2 C -1 C 1 C 2 C INT_MAX C INT_MIN })
 T(17, unsigned int, (x >= -8U && x <= -3U) || x == -2U || x == -1U || x == 0 || x == 1 || x == 2,
   { -8U C -7U C -6U C -5U C -4U C -3U C -2U C -1U C 0 C 1 C 2 },
-  { -9U C -10U C 3 C 4 C 12 C -54U C INT_MAX C INT_MIN })
+  { -9U C -10U C 3 C 4 C 12 C -54U C INT_MAX C (unsigned int)INT_MIN })
 T(18, int, (x >= -8 && x <= -3) || x == -2 || x == -1 || x == 0 || x == 1 || x == 2,
   { -8 C -7 C -6 C -5 C -4 C -3 C -2 C -1 C 0 C 1 C 2 },
   { -9 C -10 C 3 C 4 C 12 C -54 C INT_MAX C INT_MIN })