diff options
author | Thomas Quinot <quinot@adacore.com> | 2014-07-18 09:39:09 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2014-07-18 11:39:09 +0200 |
commit | e191e5aeccd561c334dd5893a9db5e33b8333814 (patch) | |
tree | 043b7e25fcb9978f88516a350571ec4b665f9ec1 /gcc | |
parent | 783d035ba7b56cde1b862ee9f276a3af1e35a1d1 (diff) | |
download | gcc-e191e5aeccd561c334dd5893a9db5e33b8333814.zip gcc-e191e5aeccd561c334dd5893a9db5e33b8333814.tar.gz gcc-e191e5aeccd561c334dd5893a9db5e33b8333814.tar.bz2 |
freeze.adb (Check_Component_Storage_Order): Fix enforcement of nesting rules for composites with different SSOs.
2014-07-18 Thomas Quinot <quinot@adacore.com>
* freeze.adb (Check_Component_Storage_Order): Fix enforcement
of nesting rules for composites with different SSOs.
2014-07-18 Thomas Quinot <quinot@adacore.com>
* par_sco.adb (Is_Logical_Operator): An If_Expression is not
a proper logical operator.
(Has_Decision): An If_Expression indicates the presence of a decision
although it is not a logical operator.
From-SVN: r212793
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/ada/freeze.adb | 46 | ||||
-rw-r--r-- | gcc/ada/par_sco.adb | 21 |
3 files changed, 63 insertions, 16 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 77c7a7f..5e3b31e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,15 @@ +2014-07-18 Thomas Quinot <quinot@adacore.com> + + * freeze.adb (Check_Component_Storage_Order): Fix enforcement + of nesting rules for composites with different SSOs. + +2014-07-18 Thomas Quinot <quinot@adacore.com> + + * par_sco.adb (Is_Logical_Operator): An If_Expression is not + a proper logical operator. + (Has_Decision): An If_Expression indicates the presence of a decision + although it is not a logical operator. + 2014-07-18 Robert Dewar <dewar@adacore.com> * gnat_ugn.texi: Remove note that -gnatR not allowed with -gnatc. diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 8491410..ab0334e 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -1086,7 +1086,7 @@ package body Freeze is Err_Node : Node_Id; Comp_Byte_Aligned : Boolean; - -- Set True for the record case, when Comp starts on a byte boundary + -- Set for the record case, True if Comp starts on a byte boundary -- (in which case it is allowed to have different storage order). Comp_SSO_Differs : Boolean; @@ -1095,6 +1095,20 @@ package body Freeze is Component_Aliased : Boolean; + function Is_Packed_Array (T : Entity_Id) return Boolean; + -- True for a packed array type + + --------------------- + -- Is_Packed_Array -- + --------------------- + + function Is_Packed_Array (T : Entity_Id) return Boolean is + begin + return Is_Array_Type (T) and then Is_Packed (T); + end Is_Packed_Array; + + -- Start of processing for Check_Component_Storage_Order + begin -- Record case @@ -1107,10 +1121,18 @@ package body Freeze is Component_Aliased := False; else - Comp_Byte_Aligned := - Present (Component_Clause (Comp)) - and then - Normalized_First_Bit (Comp) mod System_Storage_Unit = 0; + -- If a component clause is present, check whether component + -- starts on a storage element boundary. Otherwise conservatively + -- assume it does so only in the case where the record is not + -- packed. + + if Present (Component_Clause (Comp)) then + Comp_Byte_Aligned := + Normalized_First_Bit (Comp) mod System_Storage_Unit = 0; + else + Comp_Byte_Aligned := not Is_Packed (Encl_Type); + end if; + Component_Aliased := Is_Aliased (Comp); end if; @@ -1120,7 +1142,6 @@ package body Freeze is Err_Node := Encl_Type; Comp_Type := Component_Type (Encl_Type); - Comp_Byte_Aligned := False; Component_Aliased := Has_Aliased_Components (Encl_Type); end if; @@ -1167,14 +1188,23 @@ package body Freeze is -- Reject if component is a packed array, as it may be represented -- as a scalar internally. - if Is_Packed (Comp_Type) then + if Is_Packed_Array (Comp_Type) then Error_Msg_N ("type of packed component must have same scalar " & "storage order as enclosing composite", Err_Node); + -- Reject if composite is a packed array, as it may be rewritten + -- into an array of scalars. + + elsif Is_Packed_Array (Encl_Type) then + Error_Msg_N ("type of packed array must have same scalar " + & "storage order as component", Err_Node); + -- Reject if not byte aligned - elsif not Comp_Byte_Aligned then + elsif Is_Record_Type (Encl_Type) + and then not Comp_Byte_Aligned + then Error_Msg_N ("type of non-byte-aligned component must have same scalar " & "storage order as enclosing composite", Err_Node); diff --git a/gcc/ada/par_sco.adb b/gcc/ada/par_sco.adb index 0f923ca..215a81a 100644 --- a/gcc/ada/par_sco.adb +++ b/gcc/ada/par_sco.adb @@ -100,10 +100,10 @@ package body Par_SCO is -- contains a logical operator in its subtree). function Is_Logical_Operator (N : Node_Id) return Boolean; - -- N is the node for a subexpression. This procedure just tests N to see - -- if it is a logical operator (including short circuit conditions, but - -- excluding OR and AND) and returns True if so. It also returns True for - -- an if expression. False in all other cases, no other processing is done. + -- N is the node for a subexpression. This procedure determines whether N + -- a logical operator (including short circuit conditions, but excluding + -- OR and AND) and returns True if so. Note that in cases where True is + -- returned, callers assume Nkind (N) in N_Op. function To_Source_Location (S : Source_Ptr) return Source_Location; -- Converts Source_Ptr value to Source_Location (line/col) format @@ -307,6 +307,9 @@ package body Par_SCO is function Has_Decision (N : Node_Id) return Boolean is function Check_Node (N : Node_Id) return Traverse_Result; + -- Determine if Nkind (N) indicates the presence of a decision (i.e. + -- N is a logical operator -- a decision in itelsf -- or an + -- IF-expression -- whose Condition attribute is a decision). ---------------- -- Check_Node -- @@ -314,7 +317,7 @@ package body Par_SCO is function Check_Node (N : Node_Id) return Traverse_Result is begin - if Is_Logical_Operator (N) then + if Is_Logical_Operator (N) or else Nkind (N) = N_If_Expression then return Abandon; else return OK; @@ -346,7 +349,8 @@ package body Par_SCO is begin SCO_Unit_Number_Table.Init; - -- Set dummy 0'th entry in place for sort + -- The SCO_Unit_Number_Table entry with index 0 is intentionally set + -- aside to be used as temporary for sorting. SCO_Unit_Number_Table.Increment_Last; end Initialize; @@ -357,7 +361,7 @@ package body Par_SCO is function Is_Logical_Operator (N : Node_Id) return Boolean is begin - return Nkind_In (N, N_Op_Not, N_And_Then, N_Or_Else, N_If_Expression); + return Nkind_In (N, N_Op_Not, N_And_Then, N_Or_Else); end Is_Logical_Operator; ----------------------- @@ -456,7 +460,8 @@ package body Par_SCO is if Nkind_In (N, N_Op_Or, N_Or_Else) then C := '|'; - else + + else pragma Assert (Nkind_In (N, N_Op_And, N_And_Then)); C := '&'; end if; end if; |