The compiler aborts on the testcase in LTO mode because of a record type with a size expression containing a CALL_EXPR at the global level. The simple fix is to elaborate the size expression like in all the other cases.
Tested on i586-suse-linux, applied on the mainline and 4.7 branch. 2012-05-18 Eric Botcazou <ebotca...@adacore.com> * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: For an object at global level with unconstrained nominal subtype and a non-fixed size, make a variable for the size. 2012-05-18 Eric Botcazou <ebotca...@adacore.com> * gnat.dg/specs/lto12.ads: New test. * gnat.dg/specs/lto12_pkg.ads: New helper. -- Eric Botcazou
Index: gcc-interface/decl.c =================================================================== --- gcc-interface/decl.c (revision 187654) +++ gcc-interface/decl.c (working copy) @@ -760,6 +760,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entit gnu_size = max_size (TYPE_SIZE (gnu_type), true); mutable_p = true; } + + /* If we are at global level and the size isn't constant, call + elaborate_expression_1 to make a variable for it rather than + calculating it each time. */ + if (global_bindings_p () && !TREE_CONSTANT (gnu_size)) + gnu_size = elaborate_expression_1 (gnu_size, gnat_entity, + get_identifier ("SIZE"), + definition, false); } /* If the size is zero byte, make it one byte since some linkers have
package Lto12_Pkg is type R (Kind : Boolean := False) is record case Kind is when True => I : Integer; when others => null; end case; end record; function F return R; end Lto12_Pkg;
-- { dg-do compile } -- { dg-options "-flto" { target lto } } with Lto12_Pkg; use Lto12_Pkg; package Lto12 is C : constant R := F; end Lto12;