From a53b09faa5373286f38391ae90b379ecfce283f6 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 4 Aug 2008 15:53:57 -0400 Subject: [PATCH] re PR c++/36963 (Bogus narrowing conversion error in initializer list with -std=c++0x) PR c++/36963 * typeck2.c (check_narrowing): Allow narrowing conversion from an explicit floating-point constant. From-SVN: r138652 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/typeck2.c | 13 +++++++++++-- gcc/testsuite/g++.dg/cpp0x/initlist5.C | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1918189a11b..8ff23cdb5dd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2008-08-04 Jason Merrill + 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. diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index ee686fecf33..787f43963d6 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -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; } } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist5.C b/gcc/testsuite/g++.dg/cpp0x/initlist5.C index 0d02fd42d7f..fbdc673948f 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist5.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist5.C @@ -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'" } -- 2.30.2