re PR c++/36912 (ICE with "-frounding-math -g")
PR c++/36912 * varasm.c (initializer_constant_valid_p): A PLUS_EXPR or MINUS_EXPR of REAL_TYPE is not a valid constant initializer. (output_constant): Avoid crash after error. From-SVN: r153921
This commit is contained in:
parent
f4ecc8fd6b
commit
e3503aa8cf
@ -1,3 +1,10 @@
|
||||
2009-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/36912
|
||||
* varasm.c (initializer_constant_valid_p): A PLUS_EXPR
|
||||
or MINUS_EXPR of REAL_TYPE is not a valid constant initializer.
|
||||
(output_constant): Avoid crash after error.
|
||||
|
||||
2009-11-04 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR target/10127
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/36912
|
||||
* g++.dg/init/static-init2.C: New.
|
||||
|
||||
2009-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/39413
|
||||
|
3
gcc/testsuite/g++.dg/init/static-init2.C
Normal file
3
gcc/testsuite/g++.dg/init/static-init2.C
Normal file
@ -0,0 +1,3 @@
|
||||
// PR c++/36912
|
||||
// { dg-options -frounding-math }
|
||||
const double c = .1, d = c+1;
|
10
gcc/varasm.c
10
gcc/varasm.c
@ -4322,6 +4322,10 @@ initializer_constant_valid_p (tree value, tree endtype)
|
||||
|
||||
case POINTER_PLUS_EXPR:
|
||||
case PLUS_EXPR:
|
||||
/* Any valid floating-point constants will have been folded by now;
|
||||
with -frounding-math we hit this with addition of two constants. */
|
||||
if (TREE_CODE (endtype) == REAL_TYPE)
|
||||
return NULL_TREE;
|
||||
if (! INTEGRAL_TYPE_P (endtype)
|
||||
|| TYPE_PRECISION (endtype)
|
||||
>= int_or_pointer_precision (TREE_TYPE (value)))
|
||||
@ -4345,6 +4349,8 @@ initializer_constant_valid_p (tree value, tree endtype)
|
||||
break;
|
||||
|
||||
case MINUS_EXPR:
|
||||
if (TREE_CODE (endtype) == REAL_TYPE)
|
||||
return NULL_TREE;
|
||||
if (! INTEGRAL_TYPE_P (endtype)
|
||||
|| TYPE_PRECISION (endtype)
|
||||
>= int_or_pointer_precision (TREE_TYPE (value)))
|
||||
@ -4560,8 +4566,8 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
|
||||
case REAL_TYPE:
|
||||
if (TREE_CODE (exp) != REAL_CST)
|
||||
error ("initializer for floating value is not a floating constant");
|
||||
|
||||
assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
|
||||
else
|
||||
assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
|
||||
break;
|
||||
|
||||
case COMPLEX_TYPE:
|
||||
|
Loading…
Reference in New Issue
Block a user