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]

[Ada] Fix ICE with -gnatVa -g on UC to Float


This is a regression present on the mainline: the compiler aborts when trying 
to generate debug info for a temporary initialized to an unchecked conversion 
from record type for Float.  Fixed by not generating debug info in this case.

Tested on i586-suse-linux, applied on the mainline.


2010-11-10  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/decl.c (gnat_to_gnu_entity): Do not set DECL_ARTIFICIAL
	on the reused DECL node coming from a renamed object.
	Set DECL_IGNORED_P on the DECL node built for renaming entities if they
	don't need debug info.


2010-11-10  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/unchecked_convert7.adb: New test.


-- 
Eric Botcazou
Index: gcc-interface/decl.c
===================================================================
--- gcc-interface/decl.c	(revision 166490)
+++ gcc-interface/decl.c	(working copy)
@@ -4894,13 +4894,17 @@ gnat_to_gnu_entity (Entity_Id gnat_entit
 	Set_RM_Size (gnat_entity, annotate_value (rm_size (gnu_type)));
     }
 
-  if (!Comes_From_Source (gnat_entity) && DECL_P (gnu_decl))
-    DECL_ARTIFICIAL (gnu_decl) = 1;
+  /* If we really have a ..._DECL node, set a couple of flags on it.  But we
+     cannot do that if we are reusing the ..._DECL node made for a renamed
+     object, since the predicates don't apply to it but to GNAT_ENTITY.  */
+  if (DECL_P (gnu_decl) && !(Present (Renamed_Object (gnat_entity)) && saved))
+    {
+      if (!Comes_From_Source (gnat_entity))
+	DECL_ARTIFICIAL (gnu_decl) = 1;
 
-  if (!debug_info_p && DECL_P (gnu_decl)
-      && TREE_CODE (gnu_decl) != FUNCTION_DECL
-      && No (Renamed_Object (gnat_entity)))
-    DECL_IGNORED_P (gnu_decl) = 1;
+      if (!debug_info_p && TREE_CODE (gnu_decl) != FUNCTION_DECL)
+	DECL_IGNORED_P (gnu_decl) = 1;
+    }
 
   /* If we haven't already, associate the ..._DECL node that we just made with
      the input GNAT entity node.  */
-- { dg-do compile }
-- { dg-options "-g -gnatVa" }

with Unchecked_Conversion;

procedure Unchecked_Convert7 is

  type BPA is array (1 .. 23) of Boolean;
  pragma Pack (BPA);
  for BPA'Size use 23;

  subtype Byte is Natural range 0 .. 255;

  type R is
    record
      S : Boolean;
      E : Byte;
      F : BPA;
    end record;

  for R use
    record
      S at 0 range 0 .. 0;
      E at 0 range 1 .. 8;
      F at 0 range 9 .. 31;
    end record;
  for R'Size use 32;

  function Conversion
    is new Unchecked_Conversion (Source => R, Target => Float);

  F : Float := Conversion (R'(False, Byte'Last, (others => False)));

begin
  null;
end;

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