aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2012-12-05 11:47:30 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2012-12-05 11:47:30 +0100
commitde6cad7c5c435279a851b6546d7cb6cd3001d96c (patch)
treea3803d5cb1c1dc053ac715509bbad941fda70cba
parentac2b960fcf50ac868ecc2f407e67d7085bf069de (diff)
downloadgcc-de6cad7c5c435279a851b6546d7cb6cd3001d96c.zip
gcc-de6cad7c5c435279a851b6546d7cb6cd3001d96c.tar.gz
gcc-de6cad7c5c435279a851b6546d7cb6cd3001d96c.tar.bz2
[multiple changes]
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
-rw-r--r--gcc/ada/ChangeLog15
-rw-r--r--gcc/ada/exp_disp.adb7
-rw-r--r--gcc/ada/par-ch6.adb9
-rw-r--r--gcc/ada/sem_ch6.adb17
4 files changed, 35 insertions, 13 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 0443c11..b7da722 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,20 @@
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.
2012-12-05 Ed Schonberg <schonberg@adacore.com>
diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb
index c3cd9c0..8706b9e 100644
--- a/gcc/ada/exp_disp.adb
+++ b/gcc/ada/exp_disp.adb
@@ -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)
diff --git a/gcc/ada/par-ch6.adb b/gcc/ada/par-ch6.adb
index c0fc773..6ad3467 100644
--- a/gcc/ada/par-ch6.adb
+++ b/gcc/ada/par-ch6.adb
@@ -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
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 22feaebe..cfa709c 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -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;