This fixes the fallouts of the previous series of patches.

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


2011-04-02  Eric Botcazou  <ebotca...@adacore.com>

        * gcc-interface/utils.c (update_pointer_to): Finalize named pointer
        types.


2011-04-02  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/debug2.ad[sb]: New test.
        * gnat.dg/debug2_pkg.ads: New helper.
        * gnat.dg/debug3.ad[sb]: New test.


-- 
Eric Botcazou
Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 171885)
+++ gcc-interface/utils.c	(working copy)
@@ -3559,7 +3559,12 @@ update_pointer_to (tree old_type, tree n
       for (; ptr; ptr = TYPE_NEXT_PTR_TO (ptr))
 	for (t = TYPE_MAIN_VARIANT (ptr); t; t = TYPE_NEXT_VARIANT (t))
 	  TREE_TYPE (t) = new_type;
-      TYPE_POINTER_TO (old_type) = NULL_TREE;
+
+      /* If we have adjusted named types, finalize them.  This is necessary
+	 since we had forced a DWARF typedef for them in gnat_pushdecl.  */
+      for (ptr = TYPE_POINTER_TO (old_type); ptr; ptr = TYPE_NEXT_PTR_TO (ptr))
+	if (TYPE_NAME (ptr) && TREE_CODE (TYPE_NAME (ptr)) == TYPE_DECL)
+	  rest_of_type_decl_compilation (TYPE_NAME (ptr));
 
       /* Chain REF and its variants at the end.  */
       new_ref = TYPE_REFERENCE_TO (new_type);
@@ -3576,6 +3581,8 @@ update_pointer_to (tree old_type, tree n
       for (; ref; ref = TYPE_NEXT_REF_TO (ref))
 	for (t = TYPE_MAIN_VARIANT (ref); t; t = TYPE_NEXT_VARIANT (t))
 	  TREE_TYPE (t) = new_type;
+
+      TYPE_POINTER_TO (old_type) = NULL_TREE;
       TYPE_REFERENCE_TO (old_type) = NULL_TREE;
     }
 
-- { dg-do compile }
-- { dg-options "-g" }

with Debug2_Pkg; use Debug2_Pkg;

package body Debug2 is

    procedure Proc is

        function F return String_List_Ptr is
        begin
            return new String_List'(Singleton);
        end;

        A : String_List_Ptr := F;

    begin
        null;
    end;

    function Get return Integer is
    begin
        return 0;
    end;

    Failed : exception;

    A: String_Ptr;

begin

    declare
        Server_Args : Integer;
    begin
        Server_Args := Get;
    exception
        when X : Failed => A := To_Heap;
    end;

end Debug2;
package Debug2 is

    procedure Proc;

end Debug2;
package Debug2_Pkg is

    type String_Ptr is access all String;

    function To_Heap return String_Ptr;

    type String_List(Chars_Length: Positive) is private;

    type String_List_Ptr is access constant String_List;

    function Singleton return String_List;

private

    type String_List(Chars_Length: Positive) is record
        Chars: String(1..Chars_Length);
    end record;

end Debug2_Pkg;
-- { dg-do compile }
-- { dg-options "-g" }

with Ada.Unchecked_Conversion;
with System;

package body Debug3 is

  type Rec is record
     I : Integer;
  end record;
  for Rec'Alignment use 1;

  type Ptr is access Rec;

  function To_Ptr is new Ada.Unchecked_Conversion(System.Address, Ptr);

  procedure Proc is

    function Get (S1 : String) return Ptr is
    begin
       return To_Ptr (S1'Address);
    end;

    M : Ptr;

    begin
      M := Get ("");
    end;

end Debug3;
package Debug3 is

  procedure Proc;

end Debug3;

Reply via email to