aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2008-08-04 15:53:57 -0400
committerJason Merrill <jason@gcc.gnu.org>2008-08-04 15:53:57 -0400
commita53b09faa5373286f38391ae90b379ecfce283f6 (patch)
tree02c27d8f0f6946c6d8018b380fa69f12c3010c78
parent52fb73c2bf04c694a8ba5a78baa869dc2725ac53 (diff)
downloadgcc-a53b09faa5373286f38391ae90b379ecfce283f6.zip
gcc-a53b09faa5373286f38391ae90b379ecfce283f6.tar.gz
gcc-a53b09faa5373286f38391ae90b379ecfce283f6.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/typeck2.c13
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist5.C4
3 files changed, 19 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1918189..8ff23cd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index ee686fe..787f439 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 0d02fd4..fbdc673 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'" }