C++ core issue 703
authorJason Merrill <jason@redhat.com>
Fri, 20 Mar 2009 21:49:18 +0000 (17:49 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 20 Mar 2009 21:49:18 +0000 (17:49 -0400)
        C++ core issue 703
        * typeck2.c (check_narrowing): Don't complain about loss of
        precision when converting a floating-point constant.

From-SVN: r144979

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

index f533944..a4eb86a 100644 (file)
@@ -1,3 +1,9 @@
+2009-03-20  Jason Merrill  <jason@redhat.com>
+
+       C++ core issue 703
+       * typeck2.c (check_narrowing): Don't complain about loss of 
+       precision when converting a floating-point constant.
+
 2009-03-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/39495
index 6370765..747c964 100644 (file)
@@ -677,18 +677,18 @@ check_narrowing (tree type, tree init)
     {
       if (TYPE_PRECISION (type) < TYPE_PRECISION (ftype))
        {
-         ok = false;
          if (TREE_CODE (init) == REAL_CST)
            {
+             /* Issue 703: Loss of precision is OK as long as the value is
+                within the representable range of the new type.  */
+             REAL_VALUE_TYPE r;
              d = TREE_REAL_CST (init);
-             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;
+             real_convert (&r, TYPE_MODE (type), &d);
+             if (real_isinf (&r))
+               ok = false;
            }
+         else
+           ok = false;
        }
     }
   else if (INTEGRAL_OR_ENUMERATION_TYPE_P (ftype)
index c7c1e58..16d50f4 100644 (file)
@@ -1,3 +1,7 @@
+2009-03-20  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/initlist5.C: Add additional test.
+
 2009-03-19  Jakub Jelinek  <jakub@redhat.com>
            Janis Johnson  <janis187@us.ibm.com>
 
index fbdc673..958007c 100644 (file)
@@ -20,6 +20,8 @@ C c2 = { 1.1, 2 }; // { dg-error "narrowing" }
 int j { 1 }; // initialize to 1
 int k {}; // initialize to 0
 
-// PR c++/39693
+// PR c++/36963
 double d = 1.1;
 float fa[] = { d, 1.1 };      // { dg-error "narrowing conversion of 'd'" }
+const double d2 = 1.1;
+float fa2[] = { d2, 1.1 };