https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65683

            Bug ID: 65683
           Summary: [5 regression] access types across "limited with"
                    breaks restriction of No_Elaboration_Code
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ada
          Assignee: unassigned at gcc dot gnu.org
          Reporter: demoonlit at panathenaia dot halfmoon.jp

package pkg_a is
   type T is null record; -- non-controlled type
end pkg_a;

pragma Restrictions (No_Elaboration_Code);
limited with pkg_a;
package pkg_b is
   type P is access all pkg_a.T;
   for P'Storage_Size use 0;
end pkg_b;

Compile it with gcc-4.9.2.

  % gcc -c pkg_b.ads
  (success with no messages)

Compile it with gcc-5-20150405.

  % gcc -c pkg_b.ads
  pkg_b.ads:5:09: violation of restriction "no_elaboration_code" at line 2

See pkg_b.ads.dg by -gnatD, the unnecessary master is generated.

pragma restrictions (no_elaboration_code);
limited with pkg_a;
with system.system__soft_links;
with system.system__tasking;

package pkg_b is
   pkg_b___master : constant system__tasking__master_id :=
     system__soft_links__current_master.all;
   pkg_b__pM : system__tasking__master_id renames pkg_b___master;
   type pkg_b__p is access all pkg_a.t;
   for pkg_b__p'storage_size use 0;
   freeze pkg_b__p []
end pkg_b;

[subtype T1s is String (1 .. 73);]
freeze_generic T1s
freeze_generic object_pointer

This master has not appeared until gcc-4.9.
And, if "limited" is removed, it disappears with gcc-5-20150405.

Reply via email to