The routine uses an anonymous static variable and this breaks in LTO mode because a DECL_NAME is expected.
Tested on i586-suse-linux, applied on the mainline and 4.7 branch. 2012-05-20 Eric Botcazou <ebotca...@adacore.com> * gcc-interface/utils.c (gnat_write_global_declarations): Put a name on the dummy global variable. 2012-05-20 Eric Botcazou <ebotca...@adacore.com> * gnat.dg/lto13.adb: New test. * gnat.dg/lto13_pkg.ad[sb]: New helper. -- Eric Botcazou
Index: gcc-interface/utils.c =================================================================== --- gcc-interface/utils.c (revision 187691) +++ gcc-interface/utils.c (working copy) @@ -5586,8 +5586,12 @@ gnat_write_global_declarations (void) if (!VEC_empty (tree, types_used_by_cur_var_decl)) { struct varpool_node *node; + char *label; + + ASM_FORMAT_PRIVATE_NAME (label, first_global_object_name, 0); dummy_global - = build_decl (BUILTINS_LOCATION, VAR_DECL, NULL_TREE, void_type_node); + = build_decl (BUILTINS_LOCATION, VAR_DECL, get_identifier (label), + void_type_node); TREE_STATIC (dummy_global) = 1; TREE_ASM_WRITTEN (dummy_global) = 1; node = varpool_node (dummy_global);
-- { dg-do link } -- { dg-options "-g -flto" { target lto } } with Lto13_Pkg; use Lto13_Pkg; procedure Lto13 is begin Proc; end;
package Lto13_Pkg is procedure Proc; private type T; end Lto13_Pkg;
package body Lto13_Pkg is procedure Proc is begin raise Constraint_Error; end; type T is null record; end Lto13_Pkg;