diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2012-10-01 12:08:51 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2012-10-01 12:08:51 +0200 |
commit | d976bf74f0b426dc4f17228e181421e695f49c05 (patch) | |
tree | 48fb5d81c49c29d974252efaecc502e2cca8093b /gcc/ada | |
parent | 0929eaeb0128f2bcb9707ffd78bf0bca1a6b7aea (diff) | |
download | gcc-d976bf74f0b426dc4f17228e181421e695f49c05.zip gcc-d976bf74f0b426dc4f17228e181421e695f49c05.tar.gz gcc-d976bf74f0b426dc4f17228e181421e695f49c05.tar.bz2 |
[multiple changes]
2012-10-01 Hristian Kirtchev <kirtchev@adacore.com>
* sem_ch3.adb (Analyze_Declarations): Remove the specialized
code which prevents freezing when the declarative list contains
a _postconditions body. This is no longer needed because the
body is now inserted at the end of the declarations.
* sem_ch6.adb (Insert_After_Last_Declaration): New routine.
(Insert_Before_First_Source_Declaration): Removed.
(Process_PPCs): Insert the _postconditions body at the end of
the declarative list to prevent premature freezing of types that
appear in the declarations.
2012-10-01 Robert Dewar <dewar@adacore.com>
* sem_aggr.adb, sem_dim.adb: Minor reformatting.
From-SVN: r191911
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/ada/sem_aggr.adb | 5 | ||||
-rw-r--r-- | gcc/ada/sem_ch3.adb | 9 | ||||
-rw-r--r-- | gcc/ada/sem_ch6.adb | 57 | ||||
-rw-r--r-- | gcc/ada/sem_dim.adb | 141 |
5 files changed, 121 insertions, 107 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6b2c9df..5de322c 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,19 @@ +2012-10-01 Hristian Kirtchev <kirtchev@adacore.com> + + * sem_ch3.adb (Analyze_Declarations): Remove the specialized + code which prevents freezing when the declarative list contains + a _postconditions body. This is no longer needed because the + body is now inserted at the end of the declarations. + * sem_ch6.adb (Insert_After_Last_Declaration): New routine. + (Insert_Before_First_Source_Declaration): Removed. + (Process_PPCs): Insert the _postconditions body at the end of + the declarative list to prevent premature freezing of types that + appear in the declarations. + +2012-10-01 Robert Dewar <dewar@adacore.com> + + * sem_aggr.adb, sem_dim.adb: Minor reformatting. + 2012-10-01 Ed Schonberg <schonberg@adacore.com> * sem_prag.adb (Process_Convention, Process_Import_Or_Interface): diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb index f0e90ee..c8167f1 100644 --- a/gcc/ada/sem_aggr.adb +++ b/gcc/ada/sem_aggr.adb @@ -2550,7 +2550,7 @@ package body Sem_Aggr is Duplicate_Subexpr (High_Bound (Aggregate_Bounds (N)))); end if; - -- Check the dimensions of each component in the array aggregate. + -- Check the dimensions of each component in the array aggregate Analyze_Dimension_Array_Aggregate (N, Component_Typ); @@ -3392,6 +3392,7 @@ package body Sem_Aggr is -- propagate here the dimensions form Expr to New_Expr. Move_Dimensions (Expr, New_Expr); + else New_Expr := Expr; end if; @@ -4504,7 +4505,7 @@ package body Sem_Aggr is Rewrite (N, New_Aggregate); end Step_8; - -- Check the dimensions of the components in the record aggregate. + -- Check the dimensions of the components in the record aggregate Analyze_Dimension_Extension_Or_Record_Aggregate (N); end Resolve_Record_Aggregate; diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 78ec8a0..483e705 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -2152,9 +2152,7 @@ package body Sem_Ch3 is -- explicitly checked that all required types are properly frozen, -- and we do not cause general freezing here. This special circuit -- is used when the encountered body is marked as having already - -- been analyzed (although we must take into account the special - -- case of the internally generated subprogram _postconditions, - -- may not have been analyzed yet) + -- been analyzed. -- In all other cases (bodies that come from source, and expander -- generated bodies that have not been analyzed yet), freeze all @@ -2170,11 +2168,6 @@ package body Sem_Ch3 is N_Task_Body) or else Nkind (Next_Node) in N_Body_Stub) - and then not - (Ada_Version = Ada_2012 - and then Nkind (Next_Node) = N_Subprogram_Body - and then Chars (Defining_Entity (Next_Node)) - = Name_uPostconditions) then Adjust_D; Freeze_All (Freeze_From, D); diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index cdb39fb..4144fe0 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -11091,8 +11091,8 @@ package body Sem_Ch6 is -- references to parameters of the inherited subprogram to point to the -- corresponding parameters of the current subprogram. - procedure Insert_Before_First_Source_Declaration (Nod : Node_Id); - -- Insert node Nod before the first source declaration of the context + procedure Insert_After_Last_Declaration (Nod : Node_Id); + -- Insert node Nod after the last declaration of the context function Invariants_Or_Predicates_Present return Boolean; -- Determines if any invariants or predicates are present for any OUT @@ -11285,35 +11285,20 @@ package body Sem_Ch6 is return CP; end Grab_PPC; - -------------------------------------------- - -- Insert_Before_First_Source_Declaration -- - -------------------------------------------- + ----------------------------------- + -- Insert_After_Last_Declaration -- + ----------------------------------- - procedure Insert_Before_First_Source_Declaration (Nod : Node_Id) is + procedure Insert_After_Last_Declaration (Nod : Node_Id) is Decls : constant List_Id := Declarations (N); - Decl : Node_Id; begin if No (Decls) then Set_Declarations (N, New_List (Nod)); else - Decl := First (Decls); - - while Present (Decl) loop - if Comes_From_Source (Decl) then - exit; - end if; - - Next (Decl); - end loop; - - if No (Decl) then - Append_To (Decls, Nod); - else - Insert_Before (Decl, Nod); - end if; + Append_To (Decls, Nod); end if; - end Insert_Before_First_Source_Declaration; + end Insert_After_Last_Declaration; -------------------------------------- -- Invariants_Or_Predicates_Present -- @@ -11797,12 +11782,26 @@ package body Sem_Ch6 is -- The entity for the _Postconditions procedure begin - -- Insert the corresponding body of a post condition pragma before - -- the first source declaration of the context. This ensures that - -- any [sub]types generated in relation to the formals of the - -- subprogram are still visible in the _postcondition body. - - Insert_Before_First_Source_Declaration ( + -- Insert the corresponding body of a post condition pragma after + -- the last declaration of the context. This ensures that the body + -- will not cause any premature freezing as it may mention types: + + -- procedure Proc (Obj : Array_Typ) is + -- procedure _postconditions is + -- begin + -- ... Obj ... + -- end _postconditions; + + -- subtype T is Array_Typ (Obj'First (1) .. Obj'Last (1)); + -- begin + + -- In the example above, Obj is of type T but the incorrect + -- placement of _postconditions will cause a crash in gigi due to + -- an out of order reference. The body of _postconditions must be + -- placed after the declaration of Temp to preserve correct + -- visibility. + + Insert_After_Last_Declaration ( Make_Subprogram_Body (Loc, Specification => Make_Procedure_Specification (Loc, diff --git a/gcc/ada/sem_dim.adb b/gcc/ada/sem_dim.adb index 8a8b195..d752607 100644 --- a/gcc/ada/sem_dim.adb +++ b/gcc/ada/sem_dim.adb @@ -1132,9 +1132,7 @@ package body Sem_Dim is -- Aspect is an Ada 2012 feature. Note that there is no need to check -- dimensions for nodes that don't come from source. - if Ada_Version < Ada_2012 - or else not Comes_From_Source (N) - then + if Ada_Version < Ada_2012 or else not Comes_From_Source (N) then return; end if; @@ -1226,6 +1224,7 @@ package body Sem_Dim is end if; while Present (Comp) loop + -- Get the expression from the component if Nkind (Comp) = N_Component_Association then @@ -1255,10 +1254,12 @@ package body Sem_Dim is Error_Detected := True; end if; - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Comp_Typ) & ", found " & - Dimensions_Msg_Of (Expr), - Expr); + Error_Msg_N + ("\expected dimension " + & Dimensions_Msg_Of (Comp_Typ) + & ", found " + & Dimensions_Msg_Of (Expr), + Expr); end if; -- Look at the named components right after the positional components @@ -1301,7 +1302,7 @@ package body Sem_Dim is is begin Error_Msg_N ("dimensions mismatch in assignment", N); - Error_Msg_N ("\left-hand side " & Dimensions_Msg_Of (Lhs, True), N); + Error_Msg_N ("\left-hand side " & Dimensions_Msg_Of (Lhs, True), N); Error_Msg_N ("\right-hand side " & Dimensions_Msg_Of (Rhs, True), N); end Error_Dim_Msg_For_Assignment_Statement; @@ -1337,7 +1338,7 @@ package body Sem_Dim is "dimensions", N, Entity (N)); - Error_Msg_N ("\left operand " & Dimensions_Msg_Of (L, True), N); + Error_Msg_N ("\left operand " & Dimensions_Msg_Of (L, True), N); Error_Msg_N ("\right operand " & Dimensions_Msg_Of (R, True), N); end Error_Dim_Msg_For_Binary_Op; @@ -1551,6 +1552,8 @@ package body Sem_Dim is Ada_Numerics_Generic_Elementary_Functions); end Is_Elementary_Function_Entity; + -- Start of processing for Elementary_Function_Calls + begin -- Get the original subprogram entity following the renaming chain @@ -1561,6 +1564,7 @@ package body Sem_Dim is -- Check the call is an Elementary function call if Is_Elementary_Function_Entity (Ent) then + -- Sqrt function call case if Chars (Ent) = Name_Sqrt then @@ -1585,11 +1589,10 @@ package body Sem_Dim is else Actual := First_Actual (N); - while Present (Actual) loop if Exists (Dimensions_Of (Actual)) then - -- Check if an error has already been encountered so - -- far. + + -- Check if error has already been encountered so far if not Error_Detected then Error_Msg_NE ("dimensions mismatch in call of&", @@ -1682,9 +1685,10 @@ package body Sem_Dim is Expr : Node_Id) is begin Error_Msg_N ("dimensions mismatch in component declaration", N); - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Etyp) & ", found " & - Dimensions_Msg_Of (Expr), + Error_Msg_N ("\expected dimension " + & Dimensions_Msg_Of (Etyp) + & ", found " + & Dimensions_Msg_Of (Expr), Expr); end Error_Dim_Msg_For_Component_Declaration; @@ -1703,9 +1707,8 @@ package body Sem_Dim is -- dimensionless to indicate the literal is treated as if its -- dimension matches the type dimension. - if Nkind_In (Original_Node (Expr), - N_Real_Literal, - N_Integer_Literal) + if Nkind_In (Original_Node (Expr), N_Real_Literal, + N_Integer_Literal) then Dim_Warning_For_Numeric_Literal (Expr, Etyp); @@ -1729,7 +1732,7 @@ package body Sem_Dim is procedure Analyze_Dimension_Extended_Return_Statement (N : Node_Id) is Return_Ent : constant Entity_Id := Return_Statement_Entity (N); Return_Etyp : constant Entity_Id := - Etype (Return_Applies_To (Return_Ent)); + Etype (Return_Applies_To (Return_Ent)); Return_Obj_Decls : constant List_Id := Return_Object_Declarations (N); Return_Obj_Decl : Node_Id; Return_Obj_Id : Entity_Id; @@ -1754,9 +1757,10 @@ package body Sem_Dim is is begin Error_Msg_N ("dimensions mismatch in extended return statement", N); - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Return_Etyp) & ", found " & - Dimensions_Msg_Of (Return_Obj_Typ), + Error_Msg_N ("\expected dimension " + & Dimensions_Msg_Of (Return_Etyp) + & ", found " + & Dimensions_Msg_Of (Return_Obj_Typ), N); end Error_Dim_Msg_For_Extended_Return_Statement; @@ -1765,10 +1769,9 @@ package body Sem_Dim is begin if Present (Return_Obj_Decls) then Return_Obj_Decl := First (Return_Obj_Decls); - while Present (Return_Obj_Decl) loop if Nkind (Return_Obj_Decl) = N_Object_Declaration then - Return_Obj_Id := Defining_Identifier (Return_Obj_Decl); + Return_Obj_Id := Defining_Identifier (Return_Obj_Decl); if Is_Return_Object (Return_Obj_Id) then Return_Obj_Typ := Etype (Return_Obj_Id); @@ -1795,7 +1798,7 @@ package body Sem_Dim is ----------------------------------------------------- procedure Analyze_Dimension_Extension_Or_Record_Aggregate (N : Node_Id) is - Comp : Node_Id := First (Component_Associations (N)); + Comp : Node_Id; Comp_Id : Entity_Id; Comp_Typ : Entity_Id; Expr : Node_Id; @@ -1808,12 +1811,11 @@ package body Sem_Dim is -- Aspect is an Ada 2012 feature. Note that there is no need to check -- dimensions for aggregates that don't come from source. - if Ada_Version < Ada_2012 - or else not Comes_From_Source (N) - then + if Ada_Version < Ada_2012 or else not Comes_From_Source (N) then return; end if; + Comp := First (Component_Associations (N)); while Present (Comp) loop Comp_Id := Entity (First (Choices (Comp))); Comp_Typ := Etype (Comp_Id); @@ -1828,29 +1830,33 @@ package body Sem_Dim is -- dimensions of the component mismatch. if Dimensions_Of (Expr) /= Dimensions_Of (Comp_Typ) then + -- Check if an error has already been encountered so far if not Error_Detected then + -- Extension aggregate case if Nkind (N) = N_Extension_Aggregate then - Error_Msg_N ("dimensions mismatch in extension aggregate", - N); + Error_Msg_N + ("dimensions mismatch in extension aggregate", N); -- Record aggregate case else - Error_Msg_N ("dimensions mismatch in record aggregate", - N); + Error_Msg_N + ("dimensions mismatch in record aggregate", N); end if; Error_Detected := True; end if; - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Comp_Typ) & ", found " & - Dimensions_Msg_Of (Expr), - Comp); + Error_Msg_N + ("\expected dimension " + & Dimensions_Msg_Of (Comp_Typ) + & ", found " + & Dimensions_Msg_Of (Expr), + Comp); end if; end if; @@ -1871,14 +1877,11 @@ package body Sem_Dim is -- Aspect is an Ada 2012 feature. Note that there is no need to check -- dimensions for sub specs that don't come from source. - if Ada_Version < Ada_2012 - or else not Comes_From_Source (N) - then + if Ada_Version < Ada_2012 or else not Comes_From_Source (N) then return; end if; Formal := First (Formals); - while Present (Formal) loop Typ := Parameter_Type (Formal); Dims_Of_Typ := Dimensions_Of (Typ); @@ -1893,9 +1896,8 @@ package body Sem_Dim is if Present (Expr) and then Dims_Of_Typ /= Dimensions_Of (Expr) - and then Nkind_In (Original_Node (Expr), - N_Real_Literal, - N_Integer_Literal) + and then Nkind_In (Original_Node (Expr), N_Real_Literal, + N_Integer_Literal) then Dim_Warning_For_Numeric_Literal (Expr, Etype (Typ)); end if; @@ -1990,10 +1992,12 @@ package body Sem_Dim is Expr : Node_Id) is begin Error_Msg_N ("dimensions mismatch in object declaration", N); - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Etyp) & ", found " & - Dimensions_Msg_Of (Expr), - Expr); + Error_Msg_N + ("\expected dimension " + & Dimensions_Msg_Of (Etyp) + & ", found " + & Dimensions_Msg_Of (Expr), + Expr); end Error_Dim_Msg_For_Object_Declaration; -- Start of processing for Analyze_Dimension_Object_Declaration @@ -2007,22 +2011,21 @@ package body Sem_Dim is -- Check dimensions match if Dim_Of_Expr /= Dim_Of_Etyp then + -- Numeric literal case. Issue a warning if the object type is not -- dimensionless to indicate the literal is treated as if its -- dimension matches the type dimension. - if Nkind_In (Original_Node (Expr), - N_Real_Literal, - N_Integer_Literal) + if Nkind_In (Original_Node (Expr), N_Real_Literal, + N_Integer_Literal) then Dim_Warning_For_Numeric_Literal (Expr, Etyp); - -- Case where the object is a constant whose type is a dimensioned - -- type. + -- Case of object is a constant whose type is a dimensioned type elsif Constant_Present (N) and then not Exists (Dim_Of_Etyp) then - -- Propagate the dimension from the expression to the object - -- entity + + -- Propagate dimension from expression to object entity Set_Dimensions (Id, Dim_Of_Expr); @@ -2064,10 +2067,12 @@ package body Sem_Dim is Renamed_Name : Node_Id) is begin Error_Msg_N ("dimensions mismatch in object renaming declaration", N); - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Sub_Mark) & ", found " & - Dimensions_Msg_Of (Renamed_Name), - Renamed_Name); + Error_Msg_N + ("\expected dimension " + & Dimensions_Msg_Of (Sub_Mark) + & ", found " + & Dimensions_Msg_Of (Renamed_Name), + Renamed_Name); end Error_Dim_Msg_For_Object_Renaming_Declaration; -- Start of processing for Analyze_Dimension_Object_Renaming_Declaration @@ -2110,10 +2115,12 @@ package body Sem_Dim is is begin Error_Msg_N ("dimensions mismatch in return statement", N); - Error_Msg_N ("\expected dimension " & - Dimensions_Msg_Of (Return_Etyp) & ", found " & - Dimensions_Msg_Of (Expr), - Expr); + Error_Msg_N + ("\expected dimension " + & Dimensions_Msg_Of (Return_Etyp) + & ", found " + & Dimensions_Msg_Of (Expr), + Expr); end Error_Dim_Msg_For_Simple_Return_Statement; -- Start of processing for Analyze_Dimension_Simple_Return_Statement @@ -2148,8 +2155,9 @@ package body Sem_Dim is -- it cannot inherit a dimension from its subtype. if Exists (Dims_Of_Id) then - Error_Msg_N ("subtype& already" & Dimensions_Msg_Of (Id, True), - N); + Error_Msg_N + ("subtype& already" & Dimensions_Msg_Of (Id, True), N); + else Set_Dimensions (Id, Dims_Of_Etyp); Set_Symbol (Id, Symbol_Of (Etyp)); @@ -2842,7 +2850,6 @@ package body Sem_Dim is if Exists (Symbol_Of (Etyp)) then Symbols := Symbol_Of (Etyp); - else Symbols := From_Dim_To_Str_Of_Unit_Symbols (Dims_Of_Actual, System_Of (Base_Type (Etyp))); @@ -3334,7 +3341,6 @@ package body Sem_Dim is begin Start_String; - while Belong_To_Numeric_Literal (C) loop Store_String_Char (C); Src_Ptr := Src_Ptr + 1; @@ -3350,11 +3356,9 @@ package body Sem_Dim is function Symbol_Of (E : Entity_Id) return String_Id is Subtype_Symbol : constant String_Id := Symbol_Table.Get (E); - begin if Subtype_Symbol /= No_String then return Subtype_Symbol; - else return From_Dim_To_Str_Of_Unit_Symbols (Dimensions_Of (E), System_Of (Base_Type (E))); @@ -3388,4 +3392,5 @@ package body Sem_Dim is return Null_System; end System_Of; + end Sem_Dim; |