This patch improves on the error message for an aspect whose expression freezes the entity to which it applies.
Compiling BD11002.adb must yield: bd11002.adb:3:02: aspect specification causes premature freezing of "Size" --- procedure BD11002 is Sizer : constant Natural := Integer'Size with Size => Sizer; -- ERROR function Foo (P : in Natural) return Natural with Pre => P in 0 .. 3 or else Foo (P - 4) = 0; -- weird but ok function Foo (P : in Natural) return Natural is begin return P; end Foo; begin null; end BD11002; Tested on x86_64-pc-linux-gnu, committed on trunk 2016-04-20 Ed Schonberg <schonb...@adacore.com> * sem_ch13.adb (Rep_Item_Too_Late): Better error message for an illegal aspect that freezes the entity to which it applies.
Index: sem_ch13.adb =================================================================== --- sem_ch13.adb (revision 235240) +++ sem_ch13.adb (working copy) @@ -12286,6 +12286,18 @@ and then Comes_From_Source (T) then + -- A self-referential aspect is illegal if it forces freezing the + -- entity before the corresponding pragma has been analyzed. + + if Nkind_In (N, N_Attribute_Definition_Clause, N_Pragma) + and then From_Aspect_Specification (N) + then + Error_Msg_NE + ("aspect specification causes premature freezing of&", T, N); + Set_Has_Delayed_Freeze (T, False); + return True; + end if; + Too_Late; S := First_Subtype (T);