[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Wed, 5 Dec 2012 10:47:30 +0000 (11:47 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 5 Dec 2012 10:47:30 +0000 (11:47 +0100)
2012-12-05  Ed Schonberg  <schonberg@adacore.com>

* par-ch6.adb (P_Return_Object_Declaration): Do not check for
legality of Aliased keyword.
* sem_ch6.adb (Analyze_Function_Return): The keyword aliased is
legal in an extended return statement only if the return type
is immutably limited.

2012-12-05  Javier Miranda  <miranda@adacore.com>

* exp_disp.adb (Expand_Interface_Thunk): Simplify
management of controlling formals.  Required to avoid problems
with primitives of internally generated base types associated
with constrained tagged types.

From-SVN: r194201

gcc/ada/ChangeLog
gcc/ada/exp_disp.adb
gcc/ada/par-ch6.adb
gcc/ada/sem_ch6.adb

index 0443c11260fdc845bff92c8b666ffb72b2c036cd..b7da722bfc05870f9540f0bccfeaa8095900b188 100644 (file)
@@ -1,3 +1,18 @@
+2012-12-05  Ed Schonberg  <schonberg@adacore.com>
+
+       * par-ch6.adb (P_Return_Object_Declaration): Do not check for
+       legality of Aliased keyword.
+       * sem_ch6.adb (Analyze_Function_Return): The keyword aliased is
+       legal in an extended return statement only if the return type
+       is immutably limited.
+
+2012-12-05  Javier Miranda  <miranda@adacore.com>
+
+       * exp_disp.adb (Expand_Interface_Thunk): Simplify
+       management of controlling formals.  Required to avoid problems
+       with primitives of internally generated base types associated
+       with constrained tagged types.
+
 2012-12-05  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_eval.adb: Remove spurious warnings.
index c3cd9c037b265404683d52d78c9de566aee56aea..8706b9e64563eafbd7aff39fd5df92932c617e42 100644 (file)
@@ -1635,7 +1635,6 @@ package body Exp_Disp is
       Formals : constant List_Id    := New_List;
       Target  : constant Entity_Id  := Ultimate_Alias (Prim);
 
-      Controlling_Typ : Entity_Id;
       Decl_1          : Node_Id;
       Decl_2          : Node_Id;
       Expr            : Node_Id;
@@ -1713,8 +1712,6 @@ package body Exp_Disp is
          Next_Formal (Formal);
       end loop;
 
-      Controlling_Typ := Find_Dispatching_Type (Target);
-
       Target_Formal := First_Formal (Target);
       Formal        := First (Formals);
       while Present (Formal) loop
@@ -1741,7 +1738,7 @@ package body Exp_Disp is
 
          if Ekind (Target_Formal) = E_In_Parameter
            and then Ekind (Etype (Target_Formal)) = E_Anonymous_Access_Type
-           and then Ftyp = Controlling_Typ
+           and then Is_Controlling_Formal (Target_Formal)
          then
             --  Generate:
             --     type T is access all <<type of the target formal>>
@@ -1799,7 +1796,7 @@ package body Exp_Disp is
                 (Defining_Identifier (Decl_2),
                  New_Reference_To (Defining_Identifier (Decl_1), Loc)));
 
-         elsif Ftyp = Controlling_Typ then
+         elsif Is_Controlling_Formal (Target_Formal) then
 
             --  Generate:
             --     S1 : Storage_Offset := Storage_Offset!(Formal'Address)
index c0fc7734e72862444f4dbf8c6e060572fad71505..6ad3467a5d2883cfcdbaf33415c283553b124f19 100644 (file)
@@ -1721,13 +1721,8 @@ package body Ch6 is
          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 Ada 2012?");
-         else
-            Error_Msg_SC -- CODEFIX
-              ("ALIASED not allowed in extended return");
-         end if;
+         --  The restrictions on the use of aliased in an extended return
+         --  are semantic, not syntactic.
 
          if Token = Tok_Constant then
             Scan; -- past CONSTANT
index 22feaebedc4e67ddb124e497d1712a5d6f8e6f42..cfa709cd9d266e4916c84e131294af3adaaf94c3 100644 (file)
@@ -787,6 +787,7 @@ package body Sem_Ch6 is
 
             Analyze_And_Resolve (Expr, R_Type);
             Check_Limited_Return (Expr);
+
          end if;
 
          --  RETURN only allowed in SPARK as the last statement in function
@@ -806,8 +807,9 @@ package body Sem_Ch6 is
          --  Analyze parts specific to extended_return_statement:
 
          declare
-            Obj_Decl : constant Node_Id :=
+            Obj_Decl    : constant Node_Id :=
                          Last (Return_Object_Declarations (N));
+            Has_Aliased : constant Boolean := Aliased_Present (Obj_Decl);
 
             HSS : constant Node_Id := Handled_Statement_Sequence (N);
 
@@ -842,6 +844,19 @@ package body Sem_Ch6 is
             Set_Referenced (Defining_Identifier (Obj_Decl));
 
             Check_References (Stm_Entity);
+
+            --  Check RM 6.5 (5.9/3)
+
+            if Has_Aliased then
+               if Ada_Version < Ada_2012 then
+                  Error_Msg_N ("aliased only allowed for limited"
+                     & " return objects in Ada 2012?", N);
+
+               elsif not Is_Immutably_Limited_Type (R_Type) then
+                  Error_Msg_N ("aliased only allowed for limited"
+                     & " return objects", N);
+               end if;
+            end if;
          end;
       end if;