This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] Fix ICE in rtl_for_decl_init
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 15 Dec 2010 12:52:47 +0100
- Subject: [patch] Fix ICE in rtl_for_decl_init
Hi,
the attached testcase causes the compiler to ICE in rtl_for_decl_init when it
is trying to generate debug info for the constant C. The INIT expression is
NOP_EXPR<const type> (VIEW_CONVERT_EXPR<type> (CONSTRUCTOR))
with type a scalar type. The code in rtl_for_decl_init already knows how to
skip aggregate types, but it doesn't see the inner CONSTRUCTOR.
Bootstrapped/regtested on x86_64-suse-linux, OK for the mainline?
2010-12-15 Eric Botcazou <ebotcazou@adacore.com>
* dwarf2out.c (rtl_for_decl_init): Strip no-op conversions off the
initializer. Skip view conversions from aggregate types.
2010-12-15 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/unchecked_convert8.ad[sb]: New test.
--
Eric Botcazou
Index: dwarf2out.c
===================================================================
--- dwarf2out.c (revision 167721)
+++ dwarf2out.c (working copy)
@@ -16526,6 +16526,8 @@ rtl_for_decl_init (tree init, tree type)
{
rtx rtl = NULL_RTX;
+ STRIP_NOPS (init);
+
/* If a variable is initialized with a string constant without embedded
zeros, build CONST_STRING. */
if (TREE_CODE (init) == STRING_CST && TREE_CODE (type) == ARRAY_TYPE)
@@ -16550,7 +16552,10 @@ rtl_for_decl_init (tree init, tree type)
}
/* Other aggregates, and complex values, could be represented using
CONCAT: FIXME! */
- else if (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE)
+ else if (AGGREGATE_TYPE_P (type)
+ || (TREE_CODE (init) == VIEW_CONVERT_EXPR
+ && AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (init, 0))))
+ || TREE_CODE (type) == COMPLEX_TYPE)
;
/* Vectors only work if their mode is supported by the target.
FIXME: generic vectors ought to work too. */
package Unchecked_Convert8 is
procedure Dummy;
end Unchecked_Convert8;
-- { dg-do compile }
-- { dg-options "-g -O" }
with Ada.Unchecked_Conversion;
package body Unchecked_Convert8 is
type T1 is range 0 .. 255;
type T2 is
record
A : T1;
B : T1;
end record;
for T2 use
record
A at 0 range 0 .. 7;
B at 1 range 0 .. 7;
end record;
for T2'Size use 16;
type T3 is range 0 .. (2**16 - 1);
for T3'Size use 16;
function T2_TO_T3 is
new Ada.Unchecked_Conversion (Source => T2, Target => T3);
C : constant T3 := T2_TO_T3 (S => (A => 0, B => 0));
procedure Dummy is begin null; end;
end Unchecked_Convert8;