OSDN Git Service

* dwarf2out.c (rtl_for_decl_init): Strip no-op conversions off the
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Jan 2011 22:44:04 +0000 (22:44 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Jan 2011 22:44:04 +0000 (22:44 +0000)
initializer.  Skip view conversions from aggregate types.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168488 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/unchecked_convert8.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/unchecked_convert8.ads [new file with mode: 0644]

index 398410f..0b7a977 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * dwarf2out.c (rtl_for_decl_init): Strip no-op conversions off the
+       initializer.  Skip view conversions from aggregate types.
+
 2011-01-04  Kai Tietz  <kai.tietz@onevision.com>
 
        PR bootstrap/47055
index 9fe1e9c..22ee324 100644 (file)
@@ -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.  */
index 824479b..7ee893e 100644 (file)
@@ -1,3 +1,7 @@
+2011-01-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/unchecked_convert8.ad[sb]: New test.
+
 2011-01-04  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/46448
diff --git a/gcc/testsuite/gnat.dg/unchecked_convert8.adb b/gcc/testsuite/gnat.dg/unchecked_convert8.adb
new file mode 100644 (file)
index 0000000..0b8f8d1
--- /dev/null
@@ -0,0 +1,34 @@
+-- { 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;
diff --git a/gcc/testsuite/gnat.dg/unchecked_convert8.ads b/gcc/testsuite/gnat.dg/unchecked_convert8.ads
new file mode 100644 (file)
index 0000000..3a2857c
--- /dev/null
@@ -0,0 +1,5 @@
+package Unchecked_Convert8 is
+
+   procedure Dummy;
+
+end Unchecked_Convert8;