diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-12-20 14:47:44 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-12-20 14:47:44 +0100 |
commit | 54c04d6ca59426c458abdf1d7ce70dd8bb2d4dcc (patch) | |
tree | 15af7387df12f47ba864c16fa622b467a31c568a /gcc/ada | |
parent | 7b2aafc959f1ef24f111eb0d56b393bb2d315bbf (diff) | |
download | gcc-54c04d6ca59426c458abdf1d7ce70dd8bb2d4dcc.zip gcc-54c04d6ca59426c458abdf1d7ce70dd8bb2d4dcc.tar.gz gcc-54c04d6ca59426c458abdf1d7ce70dd8bb2d4dcc.tar.bz2 |
[multiple changes]
2011-12-20 Robert Dewar <dewar@adacore.com>
* sem_ch3.adb, sem_ch5.adb, s-diinio.adb, s-diinio.ads, sem_dim.adb,
sem_dim.ads, sem_res.adb, s-stposu.adb, s-stposu.ads, sem_ch4.adb,
s-diflio.adb, s-diflio.ads, exp_disp.adb, s-llflex.ads: Minor
reformatting.
* aspects.ads: Dimension[_Aspects] are GNAT defined.
2011-12-20 Robert Dewar <dewar@adacore.com>
* sem_ch13.adb (Analyze_Attribute_Definition_Clause): Check
renaming case.
2011-12-20 Thomas Quinot <quinot@adacore.com>
* sem_cat.adb, sem_ch10.adb (Analyze_With_Clause): For a WITH clause on
a child unit that is an illegal instantiation, mark the WITH clause in
error.
(Install_Siblings, Validate_Categorization_Dependency): Guard
against WITH clause marked as in error.
From-SVN: r182534
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 21 | ||||
-rwxr-xr-x | gcc/ada/aspects.ads | 26 | ||||
-rw-r--r-- | gcc/ada/exp_disp.adb | 2 | ||||
-rw-r--r-- | gcc/ada/s-diflio.adb | 18 | ||||
-rw-r--r-- | gcc/ada/s-diflio.ads | 20 | ||||
-rw-r--r-- | gcc/ada/s-diinio.adb | 22 | ||||
-rw-r--r-- | gcc/ada/s-diinio.ads | 26 | ||||
-rw-r--r-- | gcc/ada/s-llflex.ads | 2 | ||||
-rw-r--r-- | gcc/ada/s-stposu.adb | 10 | ||||
-rw-r--r-- | gcc/ada/s-stposu.ads | 29 | ||||
-rw-r--r-- | gcc/ada/sem_cat.adb | 8 | ||||
-rw-r--r-- | gcc/ada/sem_ch10.adb | 10 | ||||
-rw-r--r-- | gcc/ada/sem_ch13.adb | 45 | ||||
-rw-r--r-- | gcc/ada/sem_ch3.adb | 3 | ||||
-rw-r--r-- | gcc/ada/sem_ch4.adb | 3 | ||||
-rw-r--r-- | gcc/ada/sem_ch5.adb | 2 | ||||
-rw-r--r-- | gcc/ada/sem_dim.adb | 191 | ||||
-rw-r--r-- | gcc/ada/sem_dim.ads | 29 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 19 |
19 files changed, 264 insertions, 222 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 74d7309..dda4bac 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,24 @@ +2011-12-20 Robert Dewar <dewar@adacore.com> + + * sem_ch3.adb, sem_ch5.adb, s-diinio.adb, s-diinio.ads, sem_dim.adb, + sem_dim.ads, sem_res.adb, s-stposu.adb, s-stposu.ads, sem_ch4.adb, + s-diflio.adb, s-diflio.ads, exp_disp.adb, s-llflex.ads: Minor + reformatting. + * aspects.ads: Dimension[_Aspects] are GNAT defined. + +2011-12-20 Robert Dewar <dewar@adacore.com> + + * sem_ch13.adb (Analyze_Attribute_Definition_Clause): Check + renaming case. + +2011-12-20 Thomas Quinot <quinot@adacore.com> + + * sem_cat.adb, sem_ch10.adb (Analyze_With_Clause): For a WITH clause on + a child unit that is an illegal instantiation, mark the WITH clause in + error. + (Install_Siblings, Validate_Categorization_Dependency): Guard + against WITH clause marked as in error. + 2011-12-20 Hristian Kirtchev <kirtchev@adacore.com> * sem_res.adb (Resolve_Allocator): Warning on allocation diff --git a/gcc/ada/aspects.ads b/gcc/ada/aspects.ads index b701fe5..fe50df7 100755 --- a/gcc/ada/aspects.ads +++ b/gcc/ada/aspects.ads @@ -54,8 +54,8 @@ package Aspects is Aspect_Default_Component_Value, Aspect_Default_Iterator, Aspect_Default_Value, - Aspect_Dimension, - Aspect_Dimension_System, + Aspect_Dimension, -- GNAT + Aspect_Dimension_System, -- GNAT Aspect_Dispatching_Domain, Aspect_Dynamic_Predicate, Aspect_External_Tag, @@ -150,27 +150,29 @@ package Aspects is -- The following array identifies all implementation defined aspects Impl_Defined_Aspects : constant array (Aspect_Id) of Boolean := - (Aspect_Object_Size => True, - Aspect_Predicate => True, - Aspect_Test_Case => True, - Aspect_Value_Size => True, - Aspect_Compiler_Unit => True, - Aspect_Preelaborate_05 => True, - Aspect_Pure_05 => True, - Aspect_Pure_12 => True, - Aspect_Universal_Data => True, - Aspect_Ada_2005 => True, + (Aspect_Ada_2005 => True, Aspect_Ada_2012 => True, + Aspect_Compiler_Unit => True, + Aspect_Dimension => True, + Aspect_Dimension_System => True, Aspect_Favor_Top_Level => True, Aspect_Inline_Always => True, + Aspect_Object_Size => True, Aspect_Persistent_BSS => True, + Aspect_Predicate => True, + Aspect_Preelaborate_05 => True, + Aspect_Pure_05 => True, + Aspect_Pure_12 => True, Aspect_Pure_Function => True, Aspect_Shared => True, Aspect_Suppress_Debug_Info => True, + Aspect_Test_Case => True, + Aspect_Universal_Data => True, Aspect_Universal_Aliasing => True, Aspect_Unmodified => True, Aspect_Unreferenced => True, Aspect_Unreferenced_Objects => True, + Aspect_Value_Size => True, others => False); -- The following array indicates aspects for which multiple occurrences of diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb index 2ba3150..23ffe90 100644 --- a/gcc/ada/exp_disp.adb +++ b/gcc/ada/exp_disp.adb @@ -6512,7 +6512,7 @@ package body Exp_Disp is -- Alignment -- For CPP types we cannot rely on the value of 'Alignment provided - -- by the backend to initialize this TSD field. + -- by the backend to initialize this TSD field. Why not??? if Convention (Typ) = Convention_CPP or else Is_CPP_Class (Root_Type (Typ)) diff --git a/gcc/ada/s-diflio.adb b/gcc/ada/s-diflio.adb index 7a14b8f..46b24cd 100644 --- a/gcc/ada/s-diflio.adb +++ b/gcc/ada/s-diflio.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -41,9 +41,9 @@ package body System.Dim_Float_IO is (File : File_Type; Item : Num_Dim_Float; Unit : String := ""; - Fore : Field := Default_Fore; - Aft : Field := Default_Aft; - Exp : Field := Default_Exp) + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) is begin Num_Dim_Float_IO.Put (File, Item, Fore, Aft, Exp); @@ -53,9 +53,9 @@ package body System.Dim_Float_IO is procedure Put (Item : Num_Dim_Float; Unit : String := ""; - Fore : Field := Default_Fore; - Aft : Field := Default_Aft; - Exp : Field := Default_Exp) + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) is begin Num_Dim_Float_IO.Put (Item, Fore, Aft, Exp); @@ -66,8 +66,8 @@ package body System.Dim_Float_IO is (To : out String; Item : Num_Dim_Float; Unit : String := ""; - Aft : Field := Default_Aft; - Exp : Field := Default_Exp) + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) is begin Num_Dim_Float_IO.Put (To, Item, Aft, Exp); diff --git a/gcc/ada/s-diflio.ads b/gcc/ada/s-diflio.ads index e70dc49..1b00d27 100644 --- a/gcc/ada/s-diflio.ads +++ b/gcc/ada/s-diflio.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -30,7 +30,7 @@ ------------------------------------------------------------------------------ -- Note that this package should only be instantiated with a float dimensioned --- type. +-- type. Shouldn't this be checked??? -- This package is a generic package that provides IO facilities for float -- dimensioned types. @@ -54,23 +54,23 @@ package System.Dim_Float_IO is (File : File_Type; Item : Num_Dim_Float; Unit : String := ""; - Fore : Field := Default_Fore; - Aft : Field := Default_Aft; - Exp : Field := Default_Exp); + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); procedure Put (Item : Num_Dim_Float; Unit : String := ""; - Fore : Field := Default_Fore; - Aft : Field := Default_Aft; - Exp : Field := Default_Exp); + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); procedure Put (To : out String; Item : Num_Dim_Float; Unit : String := ""; - Aft : Field := Default_Aft; - Exp : Field := Default_Exp); + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); pragma Inline (Put); diff --git a/gcc/ada/s-diinio.adb b/gcc/ada/s-diinio.adb index b530942..75f5768 100644 --- a/gcc/ada/s-diinio.adb +++ b/gcc/ada/s-diinio.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -38,10 +38,10 @@ package body System.Dim_Integer_IO is --------- procedure Put - (File : File_Type; - Item : Num_Dim_Integer; - Unit : String := ""; - Width : Field := Default_Width; + (File : File_Type; + Item : Num_Dim_Integer; + Unit : String := ""; + Width : Field := Default_Width; Base : Number_Base := Default_Base) is @@ -51,9 +51,9 @@ package body System.Dim_Integer_IO is end Put; procedure Put - (Item : Num_Dim_Integer; - Unit : String := ""; - Width : Field := Default_Width; + (Item : Num_Dim_Integer; + Unit : String := ""; + Width : Field := Default_Width; Base : Number_Base := Default_Base) is @@ -63,9 +63,9 @@ package body System.Dim_Integer_IO is end Put; procedure Put - (To : out String; - Item : Num_Dim_Integer; - Unit : String := ""; + (To : out String; + Item : Num_Dim_Integer; + Unit : String := ""; Base : Number_Base := Default_Base) is diff --git a/gcc/ada/s-diinio.ads b/gcc/ada/s-diinio.ads index 2325cea..ca29d3c 100644 --- a/gcc/ada/s-diinio.ads +++ b/gcc/ada/s-diinio.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -30,7 +30,7 @@ ------------------------------------------------------------------------------ -- Note that this package should only be instantiated with an integer --- dimensioned type +-- dimensioned type. Shouldn't this be checked ??? -- This package is a generic package that provides IO facilities for integer -- dimensioned types. @@ -46,26 +46,26 @@ generic package System.Dim_Integer_IO is - Default_Width : Field := Num_Dim_Integer'Width; + Default_Width : Field := Num_Dim_Integer'Width; Default_Base : Number_Base := 10; procedure Put - (File : File_Type; - Item : Num_Dim_Integer; - Unit : String := ""; - Width : Field := Default_Width; + (File : File_Type; + Item : Num_Dim_Integer; + Unit : String := ""; + Width : Field := Default_Width; Base : Number_Base := Default_Base); procedure Put - (Item : Num_Dim_Integer; - Unit : String := ""; - Width : Field := Default_Width; + (Item : Num_Dim_Integer; + Unit : String := ""; + Width : Field := Default_Width; Base : Number_Base := Default_Base); procedure Put - (To : out String; - Item : Num_Dim_Integer; - Unit : String := ""; + (To : out String; + Item : Num_Dim_Integer; + Unit : String := ""; Base : Number_Base := Default_Base); pragma Inline (Put); diff --git a/gcc/ada/s-llflex.ads b/gcc/ada/s-llflex.ads index 2ff301f..bd6d8b2 100644 --- a/gcc/ada/s-llflex.ads +++ b/gcc/ada/s-llflex.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- diff --git a/gcc/ada/s-stposu.adb b/gcc/ada/s-stposu.adb index 53f65cb..5ee3f2d 100644 --- a/gcc/ada/s-stposu.adb +++ b/gcc/ada/s-stposu.adb @@ -440,7 +440,6 @@ package body System.Storage_Pools.Subpools is is begin raise Program_Error; - return Pool.Subpools.Subpool; end Default_Subpool_For_Pool; @@ -552,9 +551,7 @@ package body System.Storage_Pools.Subpools is begin -- Do nothing if the subpool was never used - if Subpool.Owner = null - or else Subpool.Node = null - then + if Subpool.Owner = null or else Subpool.Node = null then return; end if; @@ -619,8 +616,9 @@ package body System.Storage_Pools.Subpools is -- Pool_Of_Subpool -- --------------------- - function Pool_Of_Subpool (Subpool : not null Subpool_Handle) - return access Root_Storage_Pool_With_Subpools'Class + function Pool_Of_Subpool + (Subpool : not null Subpool_Handle) + return access Root_Storage_Pool_With_Subpools'Class is begin return Subpool.Owner; diff --git a/gcc/ada/s-stposu.ads b/gcc/ada/s-stposu.ads index d5819ca..47099d2 100644 --- a/gcc/ada/s-stposu.ads +++ b/gcc/ada/s-stposu.ads @@ -38,7 +38,7 @@ with System.Finalization_Masters; with System.Storage_Elements; package System.Storage_Pools.Subpools is - pragma Preelaborate (Subpools); + pragma Preelaborate; type Root_Storage_Pool_With_Subpools is abstract new Root_Storage_Pool with private; @@ -74,12 +74,13 @@ package System.Storage_Pools.Subpools is -- ??? This precondition causes errors in simple tests, disabled for now --- with Pre'Class => Pool_Of_Subpool (Subpool) = Pool'Access; + -- with Pre'Class => Pool_Of_Subpool (Subpool) = Pool'Access; -- This routine requires implementation. Allocate an object described by -- Size_In_Storage_Elements and Alignment on a subpool. - function Create_Subpool (Pool : in out Root_Storage_Pool_With_Subpools) - return not null Subpool_Handle is abstract; + function Create_Subpool + (Pool : in out Root_Storage_Pool_With_Subpools) + return not null Subpool_Handle is abstract; -- This routine requires implementation. Create a subpool within the given -- pool_with_subpools. @@ -88,15 +89,16 @@ package System.Storage_Pools.Subpools is Storage_Address : System.Address; Size_In_Storage_Elements : System.Storage_Elements.Storage_Count; Alignment : System.Storage_Elements.Storage_Count) - is null; + is null; procedure Deallocate_Subpool (Pool : in out Root_Storage_Pool_With_Subpools; - Subpool : in out Subpool_Handle) is abstract; + Subpool : in out Subpool_Handle) + is abstract; -- ??? This precondition causes errors in simple tests, disabled for now --- with Pre'Class => Pool_Of_Subpool (Subpool) = Pool'Access; + -- with Pre'Class => Pool_Of_Subpool (Subpool) = Pool'Access; -- This routine requires implementation. Reclaim the storage a particular -- subpool occupies in a pool_with_subpools. This routine is called by -- Ada.Unchecked_Deallocate_Subpool. @@ -107,8 +109,9 @@ package System.Storage_Pools.Subpools is -- Subpool_Handle_name in the allocator. The default implementation of this -- routine raises Program_Error. - function Pool_Of_Subpool (Subpool : not null Subpool_Handle) - return access Root_Storage_Pool_With_Subpools'Class; + function Pool_Of_Subpool + (Subpool : not null Subpool_Handle) + return access Root_Storage_Pool_With_Subpools'Class; -- Return the owner of the subpool procedure Set_Pool_Of_Subpool @@ -118,9 +121,11 @@ package System.Storage_Pools.Subpools is -- Create_Subpool or similar subpool constructors. Raises Program_Error -- if the subpool already belongs to a pool. - overriding function Storage_Size (Pool : Root_Storage_Pool_With_Subpools) - return System.Storage_Elements.Storage_Count is - (System.Storage_Elements.Storage_Count'Last); + overriding function Storage_Size + (Pool : Root_Storage_Pool_With_Subpools) + return System.Storage_Elements.Storage_Count + is + (System.Storage_Elements.Storage_Count'Last); private -- Model diff --git a/gcc/ada/sem_cat.adb b/gcc/ada/sem_cat.adb index 04cf958..8ac23de 100644 --- a/gcc/ada/sem_cat.adb +++ b/gcc/ada/sem_cat.adb @@ -972,7 +972,13 @@ package body Sem_Cat is while Present (Item) loop if Nkind (Item) = N_With_Clause and then not (Implicit_With (Item) - or else Limited_Present (Item)) + or else Limited_Present (Item) + + -- Skip if error already posted on the WITH + -- clause (in which case the Name attribute + -- may be invalid). + + or else Error_Posted (Item)) then Entity_Of_Withed := Entity (Name (Item)); Check_Categorization_Dependencies diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb index 27d9e45..b4c42ee 100644 --- a/gcc/ada/sem_ch10.adb +++ b/gcc/ada/sem_ch10.adb @@ -2678,7 +2678,14 @@ package body Sem_Ch10 is Generate_Reference (Par_Name, Pref); else - Set_Name (N, Make_Null (Sloc (N))); + pragma Assert (Serious_Errors_Detected /= 0); + + -- Mark the node to indicate that a related error has been posted. + -- This defends further compilation passes against cascaded errors + -- caused by the invalid WITH clause node. + + Set_Error_Posted (N); + Set_Name (N, Error); return; end if; end if; @@ -4100,6 +4107,7 @@ package body Sem_Ch10 is if Nkind (Item) /= N_With_Clause or else Implicit_With (Item) or else Limited_Present (Item) + or else Error_Posted (Item) then null; diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 31bbd13..22b2bec 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -2184,18 +2184,41 @@ package body Sem_Ch13 is U_Ent := Underlying_Type (Ent); end if; - -- Complete other routine error checks + -- Avoid cascaded error if Etype (Nam) = Any_Type then return; + -- Must be declared in current scope + elsif Scope (Ent) /= Current_Scope then Error_Msg_N ("entity must be declared in this scope", Nam); return; + -- Must not be a source renaming (we do have some cases where the + -- expander generates a renaming, and those cases are OK, in such + -- cases any attribute applies to the renamed object as well. + + elsif Is_Object (Ent) + and then Present (Renamed_Object (Ent)) + and then Comes_From_Source (Renamed_Object (Ent)) + then + Get_Name_String (Chars (N)); + Error_Msg_Strlen := Name_Len; + Error_Msg_String (1 .. Name_Len) := Name_Buffer (1 .. Name_Len); + Error_Msg_N + ("~ clause not allowed for a renaming declaration (RM 13.1(6))", + Nam); + return; + + -- If no underlying entity, use entity itself, applies to some + -- previously detected error cases ??? + elsif No (U_Ent) then U_Ent := Ent; + -- Cannot specify for a subtype (exception Object/Value_Size) + elsif Is_Type (U_Ent) and then not Is_First_Subtype (U_Ent) and then Id /= Attribute_Object_Size @@ -2367,12 +2390,6 @@ package body Sem_Ch13 is then Error_Msg_N ("constant overlays a variable?", Expr); - elsif Present (Renamed_Object (U_Ent)) then - Error_Msg_N - ("address clause not allowed" - & " for a renaming declaration (RM 13.1(6))", Nam); - return; - -- Imported variables can have an address clause, but then -- the import is pretty meaningless except to suppress -- initializations, so we do not need such variables to @@ -2523,10 +2540,16 @@ package body Sem_Ch13 is elsif Align /= No_Uint then Set_Has_Alignment_Clause (U_Ent); + -- Tagged type case, check for attempt to set alignment to a + -- value greater than Max_Align, and reset if so. + if Is_Tagged_Type (U_Ent) and then Align > Max_Align then Error_Msg_N ("?alignment for & set to Maximum_Aligment", Nam); - Set_Alignment (U_Ent, Max_Align); + Set_Alignment (U_Ent, Max_Align); + + -- All other cases + else Set_Alignment (U_Ent, Align); end if; @@ -6057,7 +6080,7 @@ package body Sem_Ch13 is Aspect_Type_Invariant => T := Standard_Boolean; - when Aspect_Dimension | + when Aspect_Dimension | Aspect_Dimension_System => raise Program_Error; @@ -8792,8 +8815,8 @@ package body Sem_Ch13 is Source : constant Entity_Id := T.Source; Target : constant Entity_Id := T.Target; - Source_Siz : Uint; - Target_Siz : Uint; + Source_Siz : Uint; + Target_Siz : Uint; begin -- This validation check, which warns if we have unequal sizes for diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 9070b45..d468c73 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -2037,6 +2037,7 @@ package body Sem_Ch3 is if Has_Aspects (N) then Analyze_Aspect_Specifications (N, Id); end if; + Analyze_Dimension (N); end Analyze_Component_Declaration; @@ -3780,6 +3781,7 @@ package body Sem_Ch3 is if Has_Aspects (N) then Analyze_Aspect_Specifications (N, Id); end if; + Analyze_Dimension (N); end Analyze_Object_Declaration; @@ -4579,6 +4581,7 @@ package body Sem_Ch3 is if Has_Aspects (N) then Analyze_Aspect_Specifications (N, Id); end if; + Analyze_Dimension (N); end Analyze_Subtype_Declaration; diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index bd56eef..97a8771 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -6045,12 +6045,13 @@ package body Sem_Ch4 is and then Is_Dimensioned_Type (Etype (L)) then Error_Msg_NE - ("exponent for dimensioned type must be a Rational" & + ("exponent for dimensioned type must be a rational" & ", found}", R, Etype (R)); else Error_Msg_NE ("exponent must be of type Natural, found}", R, Etype (R)); end if; + return; end if; diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb index 62df0de..54819b8 100644 --- a/gcc/ada/sem_ch5.adb +++ b/gcc/ada/sem_ch5.adb @@ -827,7 +827,6 @@ package body Sem_Ch5 is declare Ent : constant Entity_Id := Get_Enclosing_Object (Lhs); - begin if Present (Ent) and then Safe_To_Capture_Value (N, Ent) @@ -840,6 +839,7 @@ package body Sem_Ch5 is Set_Last_Assignment (Ent, Lhs); end if; end; + Analyze_Dimension (N); end Analyze_Assignment; diff --git a/gcc/ada/sem_dim.adb b/gcc/ada/sem_dim.adb index b069169..4f20e45 100644 --- a/gcc/ada/sem_dim.adb +++ b/gcc/ada/sem_dim.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -51,16 +51,15 @@ with GNAT.HTable; package body Sem_Dim is - -- Maximum number of dimensions in a dimension system - Max_Dimensions : constant Int := 7; + -- Maximum number of dimensions in a dimension system + subtype Dim_Id is Pos range 1 .. Max_Dimensions; -- Dim_Id values are used to identify dimensions in a dimension system -- Note that the highest value of Dim_Id is Max_Dimensions - subtype Dim_Id is Pos range 1 .. Max_Dimensions; - -- Record type for dimension system + -- A dimension system is defined by the number and the names of its -- dimensions and its base type. @@ -144,10 +143,12 @@ package body Sem_Dim is --------- function GCD (Left, Right : Whole) return Int is - L : Whole := Left; - R : Whole := Right; + L : Whole; + R : Whole; begin + L := Left; + R := Right; while R /= 0 loop L := L mod R; @@ -194,7 +195,6 @@ package body Sem_Dim is Rational'(Numerator => Left.Numerator * Right.Denominator + Left.Denominator * Right.Numerator, Denominator => Left.Denominator * Right.Denominator); - begin return Reduce (R); end "+"; @@ -263,6 +263,7 @@ package body Sem_Dim is -- The following table provides a relation between nodes and its dimension -- (if not dimensionless). If a node is not stored in the Hash Table, the -- node is considered to be dimensionless. + -- A dimension is represented by an array of Max_Dimensions Rationals. -- If the corresponding dimension system has less than Max_Dimensions -- dimensions, the array is filled by as many as Zero_Rationals needed to @@ -301,6 +302,10 @@ package body Sem_Dim is function AD_Hash (F : Node_Id) return AD_Hash_Range; + ------------- + -- AD_Hash -- + ------------- + function AD_Hash (F : Node_Id) return AD_Hash_Range is begin return AD_Hash_Range (F mod 512); @@ -442,8 +447,9 @@ package body Sem_Dim is Id : Node_Id; Expr : Node_Id) is - Def_Id : constant Entity_Id := Defining_Identifier (N); - N_Kind : constant Node_Kind := Nkind (N); + Def_Id : constant Entity_Id := Defining_Identifier (N); + N_Kind : constant Node_Kind := Nkind (N); + Analyzed : array (Dimensions'Range) of Boolean := (others => False); -- This array has been defined in order to deals with Others_Choice -- It is a reminder of the dimensions in the aggregate that have already @@ -496,6 +502,7 @@ package body Sem_Dim is is B_Typ : Node_Id; Sub_Ind : Node_Id; + begin -- Aspect_Dimension can only apply for subtypes @@ -508,7 +515,6 @@ package body Sem_Dim is if Nkind (Sub_Ind) /= N_Subtype_Indication then B_Typ := Etype (Sub_Ind); return Get_Dimension_System_Id (B_Typ); - else return No_Dim_Sys; end if; @@ -529,7 +535,6 @@ package body Sem_Dim is Typ : Entity_Id; begin - -- Check the type is dimensionless before assigning a dimension if Nkind (N) = N_Subtype_Declaration then @@ -580,9 +585,8 @@ package body Sem_Dim is if Present (Component_Associations (Expr)) then - -- If the aggregate is a positional aggregate with an - -- Others_Choice, the number of expressions must be less than or - -- equal to N_Of_Dims - 1. + -- For a positional aggregate with an Others_Choice, the number + -- of expressions must be less than or equal to N_Of_Dims - 1. if Present (Comp_Expr) then N_Dims_Aggr := List_Length (Expressions (Expr)) - 1; @@ -711,7 +715,6 @@ package body Sem_Dim is if Dim_Name = Na_Id then Dim := D; end if; - end loop; return Dim; @@ -728,14 +731,14 @@ package body Sem_Dim is Comp_Expr : Node_Id; begin - Comp_Expr := First (Expressions (Expr)); - Next (Comp_Expr); + Comp_Expr := Next (First (Expressions (Expr))); while Present (Comp_Expr) loop -- First, analyze the expression Analyze_And_Resolve (Comp_Expr); + if not Compile_Time_Known_Value (Comp_Expr) then return False; end if; @@ -744,7 +747,6 @@ package body Sem_Dim is end loop; Comp_Assn := First (Component_Associations (Expr)); - while Present (Comp_Assn) loop Comp_Expr := Expression (Comp_Assn); @@ -823,7 +825,6 @@ package body Sem_Dim is Comp_Assn := First (Component_Associations (Expr)); if Present (Comp_Expr) then - if List_Length (Component_Associations (Expr)) > 1 then Error_Msg_N ("named association cannot follow " & "positional association for aspect%", Expr); @@ -927,10 +928,10 @@ package body Sem_Dim is return; end if; - -- End the filling of Dims by the Others_Choice value - -- If N_Of_Dims < Max_Dimensions then only the - -- positions that haven't been already analyzed from - -- Dim_Id'First to N_Of_Dims are filled. + -- End the filling of Dims by the Others_Choice value. If + -- N_Of_Dims < Max_Dimensions then only the positions that + -- haven't been already analyzed from Dim_Id'First to N_Of_Dims + -- are filled. for Dim in Dim_Id'First .. N_Of_Dims loop if not Analyzed (Dim) then @@ -1011,7 +1012,8 @@ package body Sem_Dim is -- Analyze_Aspect_Dimension_System -- ------------------------------------- - -- with Dimension_System => DIMENSION_PAIRS + -- with Dimension_System => DIMENSION_PAIRS + -- DIMENSION_PAIRS ::= -- (DIMENSION_PAIR -- [, DIMENSION_PAIR] @@ -1033,9 +1035,9 @@ package body Sem_Dim is Dim_Node : Node_Id; Dim_Symbol : Node_Id; D_Sys : Dimension_System := No_Dimension_System; - Names : Name_Array := No_Names; + Names : Name_Array := No_Names; N_Of_Dims : N_Of_Dimensions; - Symbols : Symbol_Array := No_Symbols; + Symbols : Symbol_Array := No_Symbols; function Derived_From_Numeric_Type (N : Node_Id) return Boolean; -- Return True if the node is a derived type declaration from any @@ -1091,16 +1093,17 @@ package body Sem_Dim is function Check_Dimension_System_Syntax (N : Node_Id) return Boolean is Dim_Node : Node_Id; Expr_Dim : Node_Id; + begin -- Chek that the aggregate is a positional array if Present (Component_Associations (N)) then return False; - else - Dim_Node := First (Expressions (N)); + else -- Check that each component of the aggregate is an aggregate + Dim_Node := First (Expressions (N)); while Present (Dim_Node) loop -- Verify that the aggregate is a pair of identifier and string @@ -1161,7 +1164,8 @@ package body Sem_Dim is begin if List_Length (List_Expr) < Dim_Id'First - or else List_Length (List_Expr) > Max_Dimensions then + or else List_Length (List_Expr) > Max_Dimensions + then return False; else return True; @@ -1181,8 +1185,8 @@ package body Sem_Dim is end if; if not Derived_From_Numeric_Type (N) then - Error_Msg_N ("aspect% only apply for type derived from numeric type", - Id); + Error_Msg_N + ("aspect% only apply for type derived from numeric type", Id); return; end if; @@ -1325,16 +1329,14 @@ package body Sem_Dim is -- Check the lhs and the rhs have the same dimension if not Present (Dim_Lhs) then - if Present (Dim_Rhs) then Error_Msg_N ("?dimensions missmatch in assignment", N); end if; - else + else if Dim_Lhs /= Dim_Rhs then Error_Msg_N ("?dimensions missmatch in assignment", N); end if; - end if; end Analyze_Dimensions_In_Assignment; @@ -1366,7 +1368,6 @@ package body Sem_Dim is Dims : Dimensions := Zero_Dimensions; begin - if Nkind_In (N, N_Op_Add, N_Op_Mod, N_Op_Rem, N_Op_Subtract) then Error_Msg_Name_1 := Chars (N); @@ -1397,7 +1398,6 @@ package body Sem_Dim is end if; elsif Nkind_In (N_Kind, N_Op_Multiply, N_Op_Divide) then - if L_Has_Dimensions and R_Has_Dimensions then -- Get both operands dimension and add them @@ -1419,7 +1419,6 @@ package body Sem_Dim is Dims := L_Dims; elsif not L_Has_Dimensions and R_Has_Dimensions then - if N_Kind = N_Op_Multiply then Dims := R_Dims; else @@ -1499,8 +1498,7 @@ package body Sem_Dim is end; -- For relational operations, only a dimension checking is - -- performed. - -- No propagation + -- performed (no propagation). elsif N_Kind in N_Op_Compare then Error_Msg_Name_1 := Chars (N); @@ -1525,9 +1523,9 @@ package body Sem_Dim is --------------------------------------------- procedure Analyze_Dimension_Component_Declaration (N : Node_Id) is - Expr : constant Node_Id := Expression (N); - Id : constant Entity_Id := Defining_Identifier (N); - E_Typ : constant Entity_Id := Etype (Id); + Expr : constant Node_Id := Expression (N); + Id : constant Entity_Id := Defining_Identifier (N); + E_Typ : constant Entity_Id := Etype (Id); Dim_T : constant Dimensions := Get_Dimensions (E_Typ); Dim_E : Dimensions; @@ -1541,6 +1539,7 @@ package body Sem_Dim is Dim_E := Get_Dimensions (Expr); if Present (Dim_E) then + -- Return an error if the dimension of the expression and the -- dimension of the type missmatch. @@ -1549,7 +1548,7 @@ package body Sem_Dim is "declaration", N); end if; - -- If the expression is dimensionless + -- Case of dimensionless expression else Error_Msg_N @@ -1580,7 +1579,6 @@ package body Sem_Dim is begin if Present (Obj_Decls) then Obj_Decl := First (Obj_Decls); - while Present (Obj_Decl) loop if Nkind (Obj_Decl) = N_Object_Declaration then Obj_Id := Defining_Identifier (Obj_Decl); @@ -1676,7 +1674,6 @@ package body Sem_Dim is else Param := First (Par_Ass); - while Present (Param) loop Dims_Param := Get_Dimensions (Param); @@ -1726,7 +1723,6 @@ package body Sem_Dim is begin if Present (Exprs) then Expr := First (Exprs); - while Present (Expr) loop Remove_Dimensions (Expr); Next (Expr); @@ -1754,7 +1750,6 @@ package body Sem_Dim is procedure Analyze_Dimension_Identifier (N : Node_Id) is Ent : constant Entity_Id := Entity (N); Dims : constant Dimensions := Get_Dimensions (Ent); - begin if Present (Dims) then Set_Dimensions (N, Dims); @@ -1776,12 +1771,14 @@ package body Sem_Dim is begin if Present (Dim_T) then + -- Expression is present if Present (Expr) then Dim_E := Get_Dimensions (Expr); if Present (Dim_E) then + -- Return an error if the dimension of the expression and the -- dimension of the type missmatch. @@ -1797,13 +1794,12 @@ package body Sem_Dim is -- (depending on the dimensioned numeric type), return an error -- message. - if not Nkind_In - (Original_Node (Expr), - N_Real_Literal, - N_Integer_Literal) + if not Nkind_In (Original_Node (Expr), + N_Real_Literal, + N_Integer_Literal) then - Error_Msg_N ("?dimensions missmatch in object " & - "declaration", N); + Error_Msg_N + ("?dimensions missmatch in object declaration", N); end if; end if; @@ -1824,7 +1820,6 @@ package body Sem_Dim is Ren_Id : constant Node_Id := Name (N); E_Typ : constant Entity_Id := Etype (Ren_Id); Dims_Typ : constant Dimensions := Get_Dimensions (E_Typ); - begin if Present (Dims_Typ) then Copy_Dimensions (E_Typ, Id); @@ -1841,7 +1836,6 @@ package body Sem_Dim is R_Ent : constant Entity_Id := Return_Statement_Entity (N); R_Etyp : constant Entity_Id := Etype (Return_Applies_To (R_Ent)); Dims_R : constant Dimensions := Get_Dimensions (R_Etyp); - begin if Dims_R /= Dims_Expr then Error_Msg_N ("?dimensions missmatch in return statement", N); @@ -1867,9 +1861,8 @@ package body Sem_Dim is begin if Present (Dims_Typ) then - -- If the subtype already has a dimension (from - -- Aspect_Dimension), it cannot inherit a dimension from its - -- subtype. + -- If subtype already has a dimension (from Aspect_Dimension), + -- it cannot inherit a dimension from its subtype. if Present (Dims_Ent) then Error_Msg_N ("?subtype& already has a dimension", N); @@ -1890,9 +1883,8 @@ package body Sem_Dim is begin if Present (Dims_Typ) then - -- If the subtype already has a dimension (from - -- Aspect_Dimension), it cannot inherit a dimension from its - -- subtype. + -- If subtype already has a dimension (from Aspect_Dimension), + -- it cannot inherit a dimension from its subtype. if Present (Dims_Ent) then Error_Msg_N ("?subtype& already has a dimension", N); @@ -1959,9 +1951,8 @@ package body Sem_Dim is Rtype : Entity_Id; begin - -- A rational number is any number that can be expressed as the quotient - -- or fraction a/b of two integers, with the denominator b not equal to - -- zero. + -- A rational number is a number that can be expressed as the quotient + -- or fraction a/b of two integers, where b is non-zero. -- Check the expression is either a division of two integers or an -- integer itself. The check applies to the original node since the @@ -1975,16 +1966,13 @@ package body Sem_Dim is Right := Right_Opnd (Or_N); Rtype := Etype (Right); - if Is_Integer_Type (Ltype) - and then Is_Integer_Type (Rtype) - then + if Is_Integer_Type (Ltype) and then Is_Integer_Type (Rtype) then Left_Int := UI_To_Int (Expr_Value (Left)); Right_Int := UI_To_Int (Expr_Value (Right)); -- Verify that the denominator of the rational is positive if Right_Int > 0 then - if Left_Int mod Right_Int = 0 then R := +Whole (UI_To_Int (Expr_Value (Expr))); else @@ -2020,7 +2008,6 @@ package body Sem_Dim is -- Verify that the denominator of the rational is positive if Right_Int > 0 then - if Left_Int mod Right_Int = 0 then R := +Whole (-UI_To_Int (Expr_Value (Expr))); else @@ -2042,6 +2029,7 @@ package body Sem_Dim is if Is_Integer_Type (Etype (Expr)) then Right_Int := UI_To_Int (Expr_Value (Expr)); R := +Whole (Right_Int); + else Error_Msg_N ("must be a rational", Expr); end if; @@ -2054,9 +2042,8 @@ package body Sem_Dim is -- Eval the expon operator for dimensioned type - -- Note that if the exponent is an integer (denominator equals to 1) the - -- node is not evaluated here and must be evaluated by the Eval_Op_Expon - -- routine. + -- Note that if the exponent is an integer (denominator = 1) the node is + -- not evaluated here and must be evaluated by the Eval_Op_Expon routine. procedure Eval_Op_Expon_For_Dimensioned_Type (N : Node_Id; @@ -2064,11 +2051,8 @@ package body Sem_Dim is is R : constant Node_Id := Right_Opnd (N); Rat : Rational := Zero_Rational; - begin - if Compile_Time_Known_Value (R) - and then Is_Real_Type (B_Typ) - then + if Compile_Time_Known_Value (R) and then Is_Real_Type (B_Typ) then Create_Rational_From_Expr (R, Rat); Eval_Op_Expon_With_Rational_Exponent (N, Rat); end if; @@ -2105,8 +2089,7 @@ package body Sem_Dim is begin -- If Rat.Denominator = 1 that means the exponent is an Integer so - -- nothing has to be changed. - -- Note that the node must come from source + -- nothing has to be changed. Note that the node must come from source. if Comes_From_Source (N) and then Rat.Denominator /= 1 @@ -2143,6 +2126,7 @@ package body Sem_Dim is -- for Dim in Dims'First .. N_Dims loop -- Dim_Value := Dims (Dim); + -- if Dim_Value.Denominator /= 1 then -- Append (Dim_Value.Numerator / Dim_Value.Denominator, -- Aspect_Dim_Expr); @@ -2162,21 +2146,20 @@ package body Sem_Dim is for Dim in Dims'First .. Dim_Systems.Table (Sys).N_Of_Dims loop Dim_Value := Dims (Dim); + if Dim_Value.Denominator /= 1 then - Append ( + Append_To (List_Of_Dims, Make_Op_Divide (Loc, Left_Opnd => Make_Integer_Literal (Loc, Int (Dim_Value.Numerator)), Right_Opnd => Make_Integer_Literal (Loc, - Int (Dim_Value.Denominator))), - List_Of_Dims); + Int (Dim_Value.Denominator)))); + else - Append ( - Make_Integer_Literal (Loc, - Int (Dim_Value.Numerator)), - List_Of_Dims); + Append_To (List_Of_Dims, + Make_Integer_Literal (Loc, Int (Dim_Value.Numerator))); end if; end loop; @@ -2184,11 +2167,9 @@ package body Sem_Dim is New_Aspect := Make_Aspect_Specification (Loc, - Identifier => - Make_Identifier (Loc, Name_Dimension), + Identifier => Make_Identifier (Loc, Name_Dimension), Expression => - Make_Aggregate (Loc, - Expressions => List_Of_Dims)); + Make_Aggregate (Loc, Expressions => List_Of_Dims)); -- Step 1c: New identifier for the subtype @@ -2200,8 +2181,7 @@ package body Sem_Dim is New_Typ_L := Make_Subtype_Declaration (Loc, Defining_Identifier => New_E, - Subtype_Indication => - New_Occurrence_Of (Base_Typ, Loc)); + Subtype_Indication => New_Occurrence_Of (Base_Typ, Loc)); Append (New_Aspect, New_Aspects); Set_Parent (New_Aspects, New_Typ_L); @@ -2269,9 +2249,9 @@ package body Sem_Dim is -- Expand_Put_Call_With_Dimension_String -- ------------------------------------------- - -- For procedure Put defined in System.Dim_Float_IO and - -- System.Dim_Integer_IO, the default string parameter must be rewritten to - -- include the dimension symbols in the output of a dimensioned object. + -- For procedure Put defined in System.Dim_Float_IO/System.Dim_Integer_IO, + -- the default string parameter must be rewritten to include the dimension + -- symbols in the output of a dimensioned object. -- There are two different cases: @@ -2286,9 +2266,9 @@ package body Sem_Dim is -- Put (v) returns: -- > 2.1 speed - -- 2) If the parameter is an expression, the procedure + -- 2) If the parameter is an expression, then we call the procedure -- Expand_Put_Call_With_Dimension_String creates the string (for instance - -- "m.s**(-1)") and rewrites the default string parameter of Put with the + -- "m.s**(-1)") and rewrite the default string parameter of Put with the -- corresponding the String_Id. procedure Expand_Put_Call_With_Dimension_String (N : Node_Id) is @@ -2472,7 +2452,6 @@ package body Sem_Dim is Store_String_Char (' '); for Dim in Dimensions'Range loop - Dim_Rat := Dims (Dim); if Dim_Rat /= Zero_Rational then @@ -2485,7 +2464,6 @@ package body Sem_Dim is -- Positive dimension case if Dim_Rat.Numerator > 0 then - if Dim_Systems.Table (Sys).Symbols (Dim) = No_String then Store_String_Chars (Get_Name_String (Dim_Systems.Table (Sys).Names (Dim))); @@ -2496,7 +2474,6 @@ package body Sem_Dim is -- Integer case if Dim_Rat.Denominator = 1 then - if Dim_Rat.Numerator /= 1 then Store_String_Chars ("**"); Store_String_Int (Int (Dim_Rat.Numerator)); @@ -2574,6 +2551,7 @@ package body Sem_Dim is begin -- Scan the Table in order to find N + -- What is N??? no sign of anything called N here ??? for Dim_Sys in 1 .. Dim_Systems.Last loop if Parent (E) = Dim_Systems.Table (Dim_Sys).Base_Type then @@ -2588,14 +2566,13 @@ package body Sem_Dim is -- Is_Dimensioned_Type -- -------------------------- - function Is_Dimensioned_Type (E : Entity_Id) return Boolean - is + function Is_Dimensioned_Type (E : Entity_Id) return Boolean is begin if Get_Dimension_System_Id (E) /= No_Dim_Sys then return True; + else + return False; end if; - - return False; end Is_Dimensioned_Type; --------------------- @@ -2606,8 +2583,7 @@ package body Sem_Dim is Dims : constant Dimensions := Get_Dimensions (From); begin - -- Copy the dimension of 'From to 'To' and remove the dimension of - -- 'From'. + -- Copy the dimension of 'From to 'To' and remove dimension of 'From' if Present (Dims) then Set_Dimensions (To, Dims); @@ -2669,7 +2645,6 @@ package body Sem_Dim is procedure Remove_Dimensions (N : Node_Id) is Dims : constant Dimensions := Get_Dimensions (N); - begin if Present (Dims) then Aspect_Dimension_Hash_Table.Remove (N); @@ -2691,7 +2666,6 @@ package body Sem_Dim is if Present (Par_Ass) then Actual := First (Par_Ass); - while Present (Actual) loop Remove_Dimensions (Actual); Next (Actual); @@ -2740,7 +2714,6 @@ package body Sem_Dim is if S_Kind = N_Accept_Statement then declare Param : Node_Id := First (Parameter_Specifications (S)); - begin while Present (Param) loop Remove_Dimensions (Param); diff --git a/gcc/ada/sem_dim.ads b/gcc/ada/sem_dim.ads index 8089f43..cda1135 100644 --- a/gcc/ada/sem_dim.ads +++ b/gcc/ada/sem_dim.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 2011, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -26,11 +26,12 @@ -- This new package of the GNAT compiler has been created in order to enable -- any user of the GNAT compiler to deal with physical issues. --- Indeed, the user is now able to create his own dimension system and to +-- Indeed, the user is now able to create their own dimension system and to -- assign a dimension, defined from the MKS system (package System.Dim_Mks) --- or his own dimension systems, with any item and to run operations with +-- or their own dimension systems, with any item and to run operations with -- dimensionned entities. --- In that case, a dimensionnality checking will be performed at compile time. + +-- In that case, a dimensionality checking will be performed at compile time. -- If no dimension has been assigned, the compiler assumes that the item is -- dimensionless. @@ -38,12 +39,13 @@ -- Aspect_Dimension_System -- ----------------------------- --- In order to enable the user to create his own dimension system, a new +-- In order to enable the user to create their own dimension system, a new -- aspect: Aspect_Dimension_System has been created. + -- Note that this aspect applies for type declaration of type derived from any -- numeric type. --- It defines the names of each dimension. +-- It defines the names of each dimension ---------------------- -- Aspect_Dimension -- @@ -51,8 +53,10 @@ -- This new aspect applies for subtype and object declarations in order to -- define new dimensions. + -- Using this aspect, the user is able to create new subtype/object with any -- dimension needed. + -- Note that the base type of the subtype/object must be the type that defines -- the corresponding dimension system. @@ -75,6 +79,7 @@ -- Depending on the node kind, either none, one phase or two phases are -- executed. + -- Phase 2 is called only when the node allows a dimension (see body of -- Sem_Dim to get the list of nodes that permit dimensions). @@ -82,7 +87,7 @@ -- Dimension_IO -- ------------------ --- This section contains the routine used for IO purposes. +-- This section contains the routine used for IO purposes with Types; use Types; @@ -103,8 +108,8 @@ package Sem_Dim is ---------------------- procedure Analyze_Aspect_Dimension - (N : Node_Id; - Id : Node_Id; + (N : Node_Id; + Id : Node_Id; Expr : Node_Id); -- Analyzes the aggregate of Aspect_Dimension and attaches the -- corresponding dimension to N. @@ -118,9 +123,9 @@ package Sem_Dim is -- when needed. procedure Eval_Op_Expon_For_Dimensioned_Type - (N : Node_Id; + (N : Node_Id; B_Typ : Entity_Id); - -- Eval the Expon operator for dimensioned type with rational exponent + -- Evaluate the Expon operator for dimensioned type with rational exponent function Is_Dimensioned_Type (E : Entity_Id) return Boolean; -- Return True if the type is a dimensioned type (i.e: a type which has an @@ -128,7 +133,7 @@ package Sem_Dim is procedure Remove_Dimension_In_Call (N : Node_Id); -- At the end of the Expand_Call routine, remove the dimensions of every - -- parameters in the call N. + -- parameter in the call N. procedure Remove_Dimension_In_Declaration (D : Node_Id); -- At the end of Analyze_Declarations routine (see Sem_Ch3), removes the diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 3a8d7d7..3ebd88f 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -5814,8 +5814,6 @@ package body Sem_Res is end; end if; - -- dimension analysis - Analyze_Dimension (N); -- All done, evaluate call and deal with elaboration issues @@ -8015,12 +8013,10 @@ package body Sem_Res is Analyze_Dimension (N); - -- Evaluate the Expon operator for dimensioned type with rational - -- exponent. + -- Evaluate the exponentiation operator for dimensioned type with + -- rational exponent. - if Ada_Version >= Ada_2012 - and then Is_Dimensioned_Type (B_Typ) - then + if Ada_Version >= Ada_2012 and then Is_Dimensioned_Type (B_Typ) then Eval_Op_Expon_For_Dimensioned_Type (N, B_Typ); -- Skip the Eval_Op_Expon if the node has already been evaluated @@ -8657,11 +8653,12 @@ package body Sem_Res is and then Is_Packed (T) and then Is_LHS (N) then - Error_Msg_N ("?assignment to component of packed atomic record", - Prefix (N)); - Error_Msg_N ("?\may cause unexpected accesses to atomic object", - Prefix (N)); + Error_Msg_N + ("?assignment to component of packed atomic record", Prefix (N)); + Error_Msg_N + ("?\may cause unexpected accesses to atomic object", Prefix (N)); end if; + Analyze_Dimension (N); end Resolve_Selected_Component; |