AI05-0053 forbids the use of the aliased keyword in the object declaration of an extended return statement. This avoids semantic complications with return objects that are not of an immutably limited type, and which therefore are not necesarily built in place.
Compiling the following in -gnat12 mode must yield: illegal_alias.adb:15:26: "aliased" not allowed in extended return Compiling it in gnat05 mode must yield: illegal_alias.adb:15:26: warning: "aliased" not allowed in extended return in Ada2012 --- procedure Illegal_Alias is type Outer; type Inner (Ref : access Outer) is limited null record; type Outer is limited record Self : Inner (Outer'Access); Data : Integer := 0; end record; type Vector is array (Positive range <>) of Outer; subtype S is Vector (1 .. 10); function F return Vector is begin return X : aliased Vector := S'(others => <>); -- ERROR end F; begin null; end Illegal_Alias; Tested on x86_64-pc-linux-gnu, committed on trunk 2011-10-14 Ed Schonberg <schonb...@adacore.com> * par-ch6.adb (P_Return_Object_Declaration): In Ada 2012 mode, reject an aliased keyword on the object declaration of an extended return statement. In older versions of the language indicate that this is illegal in the standard.
Index: par-ch6.adb =================================================================== --- par-ch6.adb (revision 179984) +++ par-ch6.adb (working copy) @@ -1677,6 +1677,14 @@ Scan; -- past ALIASED Set_Aliased_Present (Decl_Node); + if Ada_Version < Ada_2012 then + Error_Msg_SC -- CODEFIX + ("ALIASED not allowed in extended return in Ada2012?"); + else + Error_Msg_SC -- CODEFIX + ("ALIASED not allowed in extended return"); + end if; + if Token = Tok_Constant then Scan; -- past CONSTANT Set_Constant_Present (Decl_Node);