Commit 5ab8b6b5 by Jason Merrill Committed by Jason Merrill

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: r153936
parent 30a20e97
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-05 Martin Jambor <mjambor@suse.cz> 2009-11-05 Martin Jambor <mjambor@suse.cz>
* tree-sra.c (struct access): Changed comment of next_sibling field. * tree-sra.c (struct access): Changed comment of next_sibling field.
2009-11-04 Jason Merrill <jason@redhat.com>
PR c++/36912
* g++.dg/init/static-init2.C: New.
2009-11-05 Janus Weil <janus@gcc.gnu.org> 2009-11-05 Janus Weil <janus@gcc.gnu.org>
PR fortran/41556 PR fortran/41556
......
// PR c++/36912
// { dg-options -frounding-math }
const double c = .1, d = c+1;
...@@ -4322,6 +4322,10 @@ initializer_constant_valid_p (tree value, tree endtype) ...@@ -4322,6 +4322,10 @@ initializer_constant_valid_p (tree value, tree endtype)
case POINTER_PLUS_EXPR: case POINTER_PLUS_EXPR:
case 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) if (! INTEGRAL_TYPE_P (endtype)
|| TYPE_PRECISION (endtype) || TYPE_PRECISION (endtype)
>= int_or_pointer_precision (TREE_TYPE (value))) >= int_or_pointer_precision (TREE_TYPE (value)))
...@@ -4345,6 +4349,8 @@ initializer_constant_valid_p (tree value, tree endtype) ...@@ -4345,6 +4349,8 @@ initializer_constant_valid_p (tree value, tree endtype)
break; break;
case MINUS_EXPR: case MINUS_EXPR:
if (TREE_CODE (endtype) == REAL_TYPE)
return NULL_TREE;
if (! INTEGRAL_TYPE_P (endtype) if (! INTEGRAL_TYPE_P (endtype)
|| TYPE_PRECISION (endtype) || TYPE_PRECISION (endtype)
>= int_or_pointer_precision (TREE_TYPE (value))) >= int_or_pointer_precision (TREE_TYPE (value)))
...@@ -4560,8 +4566,8 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align) ...@@ -4560,8 +4566,8 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
case REAL_TYPE: case REAL_TYPE:
if (TREE_CODE (exp) != REAL_CST) if (TREE_CODE (exp) != REAL_CST)
error ("initializer for floating value is not a floating constant"); error ("initializer for floating value is not a floating constant");
else
assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align); assemble_real (TREE_REAL_CST (exp), TYPE_MODE (TREE_TYPE (exp)), align);
break; break;
case COMPLEX_TYPE: case COMPLEX_TYPE:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment