re PR c++/36963 (Bogus narrowing conversion error in initializer list with -std=c...
authorJason Merrill <jason@redhat.com>
Mon, 4 Aug 2008 19:53:57 +0000 (15:53 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 4 Aug 2008 19:53:57 +0000 (15:53 -0400)
        PR c++/36963
        * typeck2.c (check_narrowing): Allow narrowing conversion
        from an explicit floating-point constant.

From-SVN: r138652

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/initlist5.C

index 1918189a11b5bb2360666aca4276db320f6a69db..8ff23cdb5dd3121a0ae37ef6bff553b2d2222d4a 100644 (file)
@@ -1,5 +1,9 @@
 2008-08-04  Jason Merrill  <jason@redhat.com>
 
+       PR c++/36963
+       * typeck2.c (check_narrowing): Allow narrowing conversion
+       from an explicit floating-point constant.
+
        PR c++/37006
        * pt.c (tsubst_decl): Leave DECL_INITIAL set on deleted
        instantiations.
index ee686fecf33d558236ef1e76730b742c13bd1f9f..787f43963d66ce343e8d3217e0509ef7d14f9a82 100644 (file)
@@ -640,9 +640,13 @@ check_narrowing (tree type, tree init)
   tree ftype = TREE_TYPE (init);
   bool ok = true;
   REAL_VALUE_TYPE d;
+  bool was_decl = false;
 
   if (DECL_P (init))
-    init = decl_constant_value (init);
+    {
+      was_decl = true;
+      init = decl_constant_value (init);
+    }
 
   if (TREE_CODE (type) == INTEGER_TYPE
       && TREE_CODE (ftype) == REAL_TYPE)
@@ -664,7 +668,12 @@ check_narrowing (tree type, tree init)
          if (TREE_CODE (init) == REAL_CST)
            {
              d = TREE_REAL_CST (init);
-             if (exact_real_truncate (TYPE_MODE (type), &d))
+             if (exact_real_truncate (TYPE_MODE (type), &d)
+                 /* FIXME: As a temporary workaround for PR 36963, don't
+                    complain about narrowing from a floating
+                    literal. Hopefully this will be resolved at the
+                    September 2008 C++ meeting. */
+                 || !was_decl)
                ok = true;
            }
        }
index 0d02fd42d7f9fb951d57c68397b91997b771f5a8..fbdc673948f1c27fbcb49938e46807f9b79953cc 100644 (file)
@@ -19,3 +19,7 @@ C c2 = { 1.1, 2 }; // { dg-error "narrowing" }
 
 int j { 1 }; // initialize to 1
 int k {}; // initialize to 0
+
+// PR c++/39693
+double d = 1.1;
+float fa[] = { d, 1.1 };      // { dg-error "narrowing conversion of 'd'" }