This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]