This fixes the fallouts of the previous series of patches.
Tested on i586-suse-linux, applied on the mainline.
2011-04-02 Eric Botcazou <[email protected]>
* gcc-interface/utils.c (update_pointer_to): Finalize named pointer
types.
2011-04-02 Eric Botcazou <[email protected]>
* 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;