diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2013-10-15 12:33:29 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2013-10-15 12:33:29 +0200 |
commit | ef163a0a6343e7baf9767105a8e0c0553c89f7f2 (patch) | |
tree | ed41a8b405240d78469b5cb5efbb964e603d72d9 | |
parent | 99f97947832b35ee949d5779faa3f6377c63349d (diff) | |
download | gcc-ef163a0a6343e7baf9767105a8e0c0553c89f7f2.zip gcc-ef163a0a6343e7baf9767105a8e0c0553c89f7f2.tar.gz gcc-ef163a0a6343e7baf9767105a8e0c0553c89f7f2.tar.bz2 |
[multiple changes]
2013-10-15 Hristian Kirtchev <kirtchev@adacore.com>
* sem_prag.adb (Analyze_Constituent): When
a state acts as a constituent of another state, ensure that
the said state has a Part_Of dependency in its corresponding
aspect/pragma Abstract_State.
2013-10-15 Robert Dewar <dewar@adacore.com>
* par-ch4.adb (P_If_expression): Handle redundant ELSE cleanly.
2013-10-15 Thomas Quinot <quinot@adacore.com>
* atree.ads (New_Copy, Relocate_Node): Improve documentation
(note that these subprograms reset Is_Overloaded).
2013-10-15 Thomas Quinot <quinot@adacore.com>
* checks.adb (Check_Needed): Handle the case where the test in
the left operand of the short circuit is wrapped in a qualified
expression, type conversion, or expression with actions.
2013-10-15 Thomas Quinot <quinot@adacore.com>
* sem_type.adb, sem_type.ads (Save_Interps): Also propagate
Is_Overloaded to New_N, for consistency.
2013-10-15 Ed Schonberg <schonberg@adacore.com>
* a-tienau.adb (Put): Use file parameter to query values of
current column and line length.
From-SVN: r203595
-rw-r--r-- | gcc/ada/ChangeLog | 32 | ||||
-rw-r--r-- | gcc/ada/a-tienau.adb | 10 | ||||
-rw-r--r-- | gcc/ada/atree.ads | 29 | ||||
-rw-r--r-- | gcc/ada/checks.adb | 41 | ||||
-rw-r--r-- | gcc/ada/par-ch4.adb | 8 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 14 | ||||
-rw-r--r-- | gcc/ada/sem_type.adb | 2 | ||||
-rw-r--r-- | gcc/ada/sem_type.ads | 9 |
8 files changed, 116 insertions, 29 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index babf485..382274e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,35 @@ +2013-10-15 Hristian Kirtchev <kirtchev@adacore.com> + + * sem_prag.adb (Analyze_Constituent): When + a state acts as a constituent of another state, ensure that + the said state has a Part_Of dependency in its corresponding + aspect/pragma Abstract_State. + +2013-10-15 Robert Dewar <dewar@adacore.com> + + * par-ch4.adb (P_If_expression): Handle redundant ELSE cleanly. + +2013-10-15 Thomas Quinot <quinot@adacore.com> + + * atree.ads (New_Copy, Relocate_Node): Improve documentation + (note that these subprograms reset Is_Overloaded). + +2013-10-15 Thomas Quinot <quinot@adacore.com> + + * checks.adb (Check_Needed): Handle the case where the test in + the left operand of the short circuit is wrapped in a qualified + expression, type conversion, or expression with actions. + +2013-10-15 Thomas Quinot <quinot@adacore.com> + + * sem_type.adb, sem_type.ads (Save_Interps): Also propagate + Is_Overloaded to New_N, for consistency. + +2013-10-15 Ed Schonberg <schonberg@adacore.com> + + * a-tienau.adb (Put): Use file parameter to query values of + current column and line length. + 2013-10-15 Robert Dewar <dewar@adacore.com> * sem_prag.adb, exp_ch11.adb, a-except-2005.adb, a-except-2005.ads: diff --git a/gcc/ada/a-tienau.adb b/gcc/ada/a-tienau.adb index 5498ca4..6ee9bba 100644 --- a/gcc/ada/a-tienau.adb +++ b/gcc/ada/a-tienau.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2013, 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- -- @@ -126,19 +126,19 @@ package body Ada.Text_IO.Enumeration_Aux is Actual_Width : constant Count := Count'Max (Count (Width), Item'Length); begin - -- Deal with limited line length + -- Deal with limited line length of output file - if Line_Length /= 0 then + if Line_Length (File) /= 0 then -- If actual width exceeds line length, raise Layout_Error - if Actual_Width > Line_Length then + if Actual_Width > Line_Length (File) then raise Layout_Error; end if; -- If full width cannot fit on current line move to new line - if Actual_Width + (Col - 1) > Line_Length then + if Actual_Width + (Col (File) - 1) > Line_Length (File) then New_Line (File); end if; end if; diff --git a/gcc/ada/atree.ads b/gcc/ada/atree.ads index 5465554..0f47e86 100644 --- a/gcc/ada/atree.ads +++ b/gcc/ada/atree.ads @@ -462,25 +462,26 @@ package Atree is -- with copying aspect specifications where this is required. function New_Copy (Source : Node_Id) return Node_Id; - -- This function allocates a completely new node, and then initializes it - -- by copying the contents of the source node into it. The contents of the - -- source node is not affected. The target node is always marked as not - -- being in a list (even if the source is a list member). The new node will - -- have an extension if the source has an extension. New_Copy (Empty) - -- returns Empty and New_Copy (Error) returns Error. Note that, unlike - -- Copy_Separate_Tree, New_Copy does not recursively copy any descendents, - -- so in general parent pointers are not set correctly for the descendents - -- of the copied node. Both normal and extended nodes (entities) may be - -- copied using New_Copy. + -- This function allocates a completely new node, and then initializes + -- it by copying the contents of the source node into it. The contents of + -- the source node is not affected. The target node is always marked as + -- not being in a list (even if the source is a list member), and not + -- overloaded. The new node will have an extension if the source has + -- an extension. New_Copy (Empty) returns Empty, and New_Copy (Error) + -- returns Error. Note that, unlike Copy_Separate_Tree, New_Copy does not + -- recursively copy any descendents, so in general parent pointers are not + -- set correctly for the descendents of the copied node. Both normal and + -- extended nodes (entities) may be copied using New_Copy. function Relocate_Node (Source : Node_Id) return Node_Id; -- Source is a non-entity node that is to be relocated. A new node is - -- allocated and the contents of Source are copied to this node using - -- Copy_Node. The parent pointers of descendents of the node are then + -- allocated, and the contents of Source are copied to this node, using + -- New_Copy. The parent pointers of descendents of the node are then -- adjusted to point to the relocated copy. The original node is not -- modified, but the parent pointers of its descendents are no longer - -- valid. This routine is used in conjunction with the tree rewrite - -- routines (see descriptions of Replace/Rewrite). + -- valid. The new copy is always marked as not overloaded. This routine is + -- used in conjunction with the tree rewrite routines (see descriptions of + -- Replace/Rewrite). -- -- Note that the resulting node has the same parent as the source node, and -- is thus still attached to the tree. It is valid for Source to be Empty, diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index f968e20..65dedc2 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -3554,6 +3554,32 @@ package body Checks is L : Node_Id; R : Node_Id; + function Left_Expression (Op : Node_Id) return Node_Id; + -- Return the relevant expression from the left operand of the given + -- short circuit form: this is LO itself, except if LO is a qualified + -- expression, a type conversion, or an expression with actions, in + -- which case this is Left_Expression (Expression (LO)). + + --------------------- + -- Left_Expression -- + --------------------- + + function Left_Expression (Op : Node_Id) return Node_Id is + LE : Node_Id := Left_Opnd (Op); + begin + while Nkind_In (LE, + N_Qualified_Expression, + N_Type_Conversion, + N_Expression_With_Actions) + loop + LE := Expression (LE); + end loop; + + return LE; + end Left_Expression; + + -- Start of processing for Check_Needed + begin -- Always check if not simple entity @@ -3587,37 +3613,40 @@ package body Checks is elsif K = N_Op_Or then exit when N = Right_Opnd (P) - and then Nkind (Left_Opnd (P)) = N_Op_Eq; + and then Nkind (Left_Expression (P)) = N_Op_Eq; elsif K = N_Or_Else then exit when (N = Right_Opnd (P) or else (Is_List_Member (N) and then List_Containing (N) = Actions (P))) - and then Nkind (Left_Opnd (P)) = N_Op_Eq; + and then Nkind (Left_Expression (P)) = N_Op_Eq; -- Similar test for the And/And then case, where the left operand -- is an inequality test. elsif K = N_Op_And then exit when N = Right_Opnd (P) - and then Nkind (Left_Opnd (P)) = N_Op_Ne; + and then Nkind (Left_Expression (P)) = N_Op_Ne; elsif K = N_And_Then then exit when (N = Right_Opnd (P) or else (Is_List_Member (N) and then List_Containing (N) = Actions (P))) - and then Nkind (Left_Opnd (P)) = N_Op_Ne; + and then Nkind (Left_Expression (P)) = N_Op_Ne; end if; N := P; end loop; -- If we fall through the loop, then we have a conditional with an - -- appropriate test as its left operand. So test further. + -- appropriate test as its left operand, so look further. + + L := Left_Expression (P); + + -- L is an "=" or "/=" operator: extract its operands - L := Left_Opnd (P); R := Right_Opnd (L); L := Left_Opnd (L); diff --git a/gcc/ada/par-ch4.adb b/gcc/ada/par-ch4.adb index 5766639..cdf0dab 100644 --- a/gcc/ada/par-ch4.adb +++ b/gcc/ada/par-ch4.adb @@ -3120,6 +3120,14 @@ package body Ch4 is Scan; -- Past ELSE Append_To (Exprs, P_Expression); + -- Skip redundant ELSE parts + + while Token = Tok_Else loop + Error_Msg_SC ("only one ELSE part is allowed"); + Scan; -- past ELSE + Discard_Junk_Node (P_Expression); + end loop; + -- Two expression case (implied True, filled in during semantics) else diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 48aa1ac..64d684d 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -21521,6 +21521,20 @@ package body Sem_Prag is if Ekind_In (Constit_Id, E_Abstract_State, E_Variable) then Check_Matching_Constituent (Constit_Id); + + -- A state can act as a constituent only when it is part + -- of another state. This relation is expressed by option + -- "Part_Of" of pragma Abstract_State. + + if Ekind (Constit_Id) = E_Abstract_State + and then not Is_Part_Of (Constit_Id, State_Id) + then + Error_Msg_Name_1 := Chars (State_Id); + Error_Msg_NE + ("state & is not a valid constituent of ancestor " + & "state %", Constit, Constit_Id); + end if; + else Error_Msg_NE ("constituent & must denote a variable or state", diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb index 9b9a709..7239410 100644 --- a/gcc/ada/sem_type.adb +++ b/gcc/ada/sem_type.adb @@ -3209,6 +3209,8 @@ package body Sem_Type is begin if Is_Overloaded (Old_N) then + Set_Is_Overloaded (New_N); + if Nkind (Old_N) = N_Selected_Component and then Is_Overloaded (Selector_Name (Old_N)) then diff --git a/gcc/ada/sem_type.ads b/gcc/ada/sem_type.ads index 2c5c1db..60eefa5 100644 --- a/gcc/ada/sem_type.ads +++ b/gcc/ada/sem_type.ads @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2013, 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- -- @@ -124,7 +124,7 @@ package Sem_Type is -- denotes whether an interpretation has been disabled by an abstract -- operator. Add_One_Interp includes semantic processing to deal with -- adding entries that hide one another etc. - + -- -- For operators, the legality of the operation depends on the visibility -- of T and its scope. If the operator is an equality or comparison, T is -- always Boolean, and we use Opnd_Type, which is a candidate type for one @@ -158,8 +158,9 @@ package Sem_Type is procedure Save_Interps (Old_N : Node_Id; New_N : Node_Id); -- If an overloaded node is rewritten during semantic analysis, its -- possible interpretations must be linked to the copy. This procedure - -- transfers the overload information from Old_N, the old node, to - -- New_N, its new copy. It has no effect in the non-overloaded case. + -- transfers the overload information (Is_Overloaded flag, and list of + -- interpretations) from Old_N, the old node, to New_N, its new copy. + -- It has no effect in the non-overloaded case. function Covers (T1, T2 : Entity_Id) return Boolean; -- This is the basic type compatibility routine. T1 is the expected type, |