Commit 7271429c by Arnaud Charlet

[multiple changes]

2013-04-25  Matthew Heaney  <heaney@adacore.com>

	* a-rbtgbo.adb, a-crbtgo.adb (Generic_Equal): do not test for
	tampering when container empty.
	* a-crbtgk.adb (Ceiling, Find, Floor): ditto.
	(Generic_Conditional_Insert, Generic_Conditional_Insert_With_Hint):
	ditto.

2013-04-25  Ed Schonberg  <schonberg@adacore.com>

	* par-ch12.adb: Move aspects from package specification to
	generic package declaration.
	* sem_ch12.adb: Analyze aspect specifications before building
	and analyzing the generic copy, so that the generated pragmas
	are properly taken into account.
	* sem_ch13.adb: For compilation unit aspects that apply to a
	generic package declaration, insert corresponding pragmas ahead
	of visible declarations.
	* sprint.adb: Display properly the aspects of a generic type
	declaration.

2013-04-25  Robert Dewar  <dewar@adacore.com>

	* frontend.adb: Minor reformatting.

2013-04-25  Ed Schonberg  <schonberg@adacore.com>

	* einfo.ads: Extend documentation on use of Is_Private_Ancestor
	for untagged types.
	* sem_ch3.adb (Is_Visible_Component): Refine predicate for the
	case of untagged types derived from private types, to reject
	illegal selected components.

From-SVN: r198285
parent a5226d6c
2013-04-25 Matthew Heaney <heaney@adacore.com>
* a-rbtgbo.adb, a-crbtgo.adb (Generic_Equal): do not test for
tampering when container empty.
* a-crbtgk.adb (Ceiling, Find, Floor): ditto.
(Generic_Conditional_Insert, Generic_Conditional_Insert_With_Hint):
ditto.
2013-04-25 Ed Schonberg <schonberg@adacore.com>
* par-ch12.adb: Move aspects from package specification to
generic package declaration.
* sem_ch12.adb: Analyze aspect specifications before building
and analyzing the generic copy, so that the generated pragmas
are properly taken into account.
* sem_ch13.adb: For compilation unit aspects that apply to a
generic package declaration, insert corresponding pragmas ahead
of visible declarations.
* sprint.adb: Display properly the aspects of a generic type
declaration.
2013-04-25 Robert Dewar <dewar@adacore.com>
* frontend.adb: Minor reformatting.
2013-04-25 Ed Schonberg <schonberg@adacore.com>
* einfo.ads: Extend documentation on use of Is_Private_Ancestor
for untagged types.
* sem_ch3.adb (Is_Visible_Component): Refine predicate for the
case of untagged types derived from private types, to reject
illegal selected components.
2013-04-25 Gary Dismukes <dismukes@adacore.com> 2013-04-25 Gary Dismukes <dismukes@adacore.com>
* sem_util.adb (Is_Dependent_Component_Of_Mutable_Object): Test * sem_util.adb (Is_Dependent_Component_Of_Mutable_Object): Test
......
...@@ -45,6 +45,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is ...@@ -45,6 +45,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is
X : Node_Access; X : Node_Access;
begin begin
-- If the container is empty, return a result immediately, so that we do
-- not manipulate the tamper bits unnecessarily.
if Tree.Root = null then
return null;
end if;
-- Per AI05-0022, the container implementation is required to detect -- Per AI05-0022, the container implementation is required to detect
-- element tampering by a generic actual subprogram. -- element tampering by a generic actual subprogram.
...@@ -87,6 +94,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is ...@@ -87,6 +94,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is
Result : Node_Access; Result : Node_Access;
begin begin
-- If the container is empty, return a result immediately, so that we do
-- not manipulate the tamper bits unnecessarily.
if Tree.Root = null then
return null;
end if;
-- Per AI05-0022, the container implementation is required to detect -- Per AI05-0022, the container implementation is required to detect
-- element tampering by a generic actual subprogram. -- element tampering by a generic actual subprogram.
...@@ -137,6 +151,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is ...@@ -137,6 +151,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is
X : Node_Access; X : Node_Access;
begin begin
-- If the container is empty, return a result immediately, so that we do
-- not manipulate the tamper bits unnecessarily.
if Tree.Root = null then
return null;
end if;
-- Per AI05-0022, the container implementation is required to detect -- Per AI05-0022, the container implementation is required to detect
-- element tampering by a generic actual subprogram. -- element tampering by a generic actual subprogram.
...@@ -198,6 +219,15 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is ...@@ -198,6 +219,15 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is
-- its previous neighbor, in order for the conditional insertion to -- its previous neighbor, in order for the conditional insertion to
-- succeed. -- succeed.
-- Handle insertion into an empty container as a special case, so that
-- we do not manipulate the tamper bits unnecessarily.
if Tree.Root = null then
Insert_Post (Tree, null, True, Node);
Inserted := True;
return;
end if;
-- We search the tree to find the nearest neighbor of Key, which is -- We search the tree to find the nearest neighbor of Key, which is
-- either the smallest node greater than Key (Inserted is True), or the -- either the smallest node greater than Key (Inserted is True), or the
-- largest node less or equivalent to Key (Inserted is False). -- largest node less or equivalent to Key (Inserted is False).
...@@ -227,9 +257,9 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is ...@@ -227,9 +257,9 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is
if Inserted then if Inserted then
-- Either Tree is empty, or Key is less than Y. If Y is the first -- Key is less than Y. If Y is the first node in the tree, then there
-- node in the tree, then there are no other nodes that we need to -- are no other nodes that we need to search for, and we insert a new
-- search for, and we insert a new node into the tree. -- node into the tree.
if Y = Tree.First then if Y = Tree.First then
Insert_Post (Tree, Y, True, Node); Insert_Post (Tree, Y, True, Node);
...@@ -316,18 +346,26 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is ...@@ -316,18 +346,26 @@ package body Ada.Containers.Red_Black_Trees.Generic_Keys is
-- is not a search and the only comparisons that occur are with -- is not a search and the only comparisons that occur are with
-- the hint and its neighbor. -- the hint and its neighbor.
-- If Position is null, this is interpreted to mean that Key is -- Handle insertion into an empty container as a special case, so that
-- large relative to the nodes in the tree. If the tree is empty, -- we do not manipulate the tamper bits unnecessarily.
-- or Key is greater than the last node in the tree, then we're
-- done; otherwise the hint was "wrong" and we must search. if Tree.Root = null then
Insert_Post (Tree, null, True, Node);
Inserted := True;
return;
end if;
-- If Position is null, this is interpreted to mean that Key is large
-- relative to the nodes in the tree. If Key is greater than the last
-- node in the tree, then we're done; otherwise the hint was "wrong" and
-- we must search.
if Position = null then -- largest if Position = null then -- largest
begin begin
B := B + 1; B := B + 1;
L := L + 1; L := L + 1;
Compare := Compare := Is_Greater_Key_Node (Key, Tree.Last);
Tree.Last = null or else Is_Greater_Key_Node (Key, Tree.Last);
L := L - 1; L := L - 1;
B := B - 1; B := B - 1;
......
...@@ -646,6 +646,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is ...@@ -646,6 +646,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is
return False; return False;
end if; end if;
-- If the containers are empty, return a result immediately, so as to
-- not manipulate the tamper bits unnecessarily.
if Left.Length = 0 then
return True;
end if;
-- Per AI05-0022, the container implementation is required to detect -- Per AI05-0022, the container implementation is required to detect
-- element tampering by a generic actual subprogram. -- element tampering by a generic actual subprogram.
......
...@@ -626,6 +626,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Bounded_Operations is ...@@ -626,6 +626,13 @@ package body Ada.Containers.Red_Black_Trees.Generic_Bounded_Operations is
return False; return False;
end if; end if;
-- If the containers are empty, return a result immediately, so as to
-- not manipulate the tamper bits unnecessarily.
if Left.Length = 0 then
return True;
end if;
-- Per AI05-0022, the container implementation is required to detect -- Per AI05-0022, the container implementation is required to detect
-- element tampering by a generic actual subprogram. -- element tampering by a generic actual subprogram.
......
...@@ -1753,12 +1753,14 @@ package Einfo is ...@@ -1753,12 +1753,14 @@ package Einfo is
-- is defined for the type. -- is defined for the type.
-- Has_Private_Ancestor (Flag151) -- Has_Private_Ancestor (Flag151)
-- Applies to type extensions. True if some ancestor is derived from a -- Applies to untagged derived types and to type extensions. True when
-- private type, making some components invisible and aggregates illegal. -- some ancestor is derived from a private type, making some components
-- This flag is set at the point of derivation. The legality of the -- invisible and aggregates illegal. Used to check the legality of
-- aggregate must be rechecked because it also depends on the visibility -- selected components and aggregates. The flag is set at the point of
-- at the point the aggregate is resolved. See sem_aggr.adb. -- derivation.
-- This is part of AI05-0115. -- The legality of an aggregate of a type with a private ancestor must
-- be checked because it also depends on the visibility at the point the
-- aggregate is resolved. See sem_aggr.adb. This is part of AI05-0115.
-- Has_Private_Declaration (Flag155) -- Has_Private_Declaration (Flag155)
-- Defined in all entities. Returns True if it is the defining entity -- Defined in all entities. Returns True if it is the defining entity
......
...@@ -185,10 +185,13 @@ begin ...@@ -185,10 +185,13 @@ begin
-- Check for VAX Float -- Check for VAX Float
if Targparm.VAX_Float_On_Target then if Targparm.VAX_Float_On_Target then
-- pragma Float_Representation (VAX_Float); -- pragma Float_Representation (VAX_Float);
Opt.Float_Format := 'V'; Opt.Float_Format := 'V';
-- pragma Long_Float (G_Float); -- pragma Long_Float (G_Float);
Opt.Float_Format_Long := 'G'; Opt.Float_Format_Long := 'G';
Set_Standard_Fpt_Formats; Set_Standard_Fpt_Formats;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- 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 -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -204,6 +204,11 @@ package body Ch12 is ...@@ -204,6 +204,11 @@ package body Ch12 is
Gen_Decl := New_Node (N_Generic_Package_Declaration, Gen_Sloc); Gen_Decl := New_Node (N_Generic_Package_Declaration, Gen_Sloc);
Set_Specification (Gen_Decl, P_Package (Pf_Spcn)); Set_Specification (Gen_Decl, P_Package (Pf_Spcn));
-- Aspects have been parsed by the package spec. Move them to the
-- generic declaration where they belong.
Move_Aspects (Specification (Gen_Decl), Gen_Decl);
else else
Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc); Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc);
......
...@@ -3021,6 +3021,13 @@ package body Sem_Ch12 is ...@@ -3021,6 +3021,13 @@ package body Sem_Ch12 is
Id := Defining_Entity (N); Id := Defining_Entity (N);
Generate_Definition (Id); Generate_Definition (Id);
-- Analyze aspects now, so that generated pragmas appear in the
-- declarations before building and analyzing the generic copy.
if Has_Aspects (N) then
Analyze_Aspect_Specifications (N, Id);
end if;
-- Expansion is not applied to generic units -- Expansion is not applied to generic units
Start_Generic; Start_Generic;
...@@ -3079,9 +3086,6 @@ package body Sem_Ch12 is ...@@ -3079,9 +3086,6 @@ package body Sem_Ch12 is
end if; end if;
end if; end if;
if Has_Aspects (N) then
Analyze_Aspect_Specifications (N, Id);
end if;
end Analyze_Generic_Package_Declaration; end Analyze_Generic_Package_Declaration;
-------------------------------------------- --------------------------------------------
......
...@@ -1986,7 +1986,9 @@ package body Sem_Ch13 is ...@@ -1986,7 +1986,9 @@ package body Sem_Ch13 is
-- issue of visibility delay for these aspects. -- issue of visibility delay for these aspects.
if A_Id in Library_Unit_Aspects if A_Id in Library_Unit_Aspects
and then Nkind (N) = N_Package_Declaration and then
Nkind_In (N, N_Package_Declaration,
N_Generic_Package_Declaration)
and then Nkind (Parent (N)) /= N_Compilation_Unit and then Nkind (Parent (N)) /= N_Compilation_Unit
then then
Error_Msg_N Error_Msg_N
...@@ -2041,7 +2043,9 @@ package body Sem_Ch13 is ...@@ -2041,7 +2043,9 @@ package body Sem_Ch13 is
-- In the context of a compilation unit, we directly put the -- In the context of a compilation unit, we directly put the
-- pragma in the Pragmas_After list of the N_Compilation_Unit_Aux -- pragma in the Pragmas_After list of the N_Compilation_Unit_Aux
-- node (no delay is required here) except for aspects on a -- node (no delay is required here) except for aspects on a
-- subprogram body (see below). -- subprogram body (see below) and a generic package, for which
-- we need to introduce the pragma before building the generic
-- copy (see sem_ch12).
elsif Nkind (Parent (N)) = N_Compilation_Unit elsif Nkind (Parent (N)) = N_Compilation_Unit
and then (Present (Aitem) or else Is_Boolean_Aspect (Aspect)) and then (Present (Aitem) or else Is_Boolean_Aspect (Aspect))
...@@ -2082,6 +2086,14 @@ package body Sem_Ch13 is ...@@ -2082,6 +2086,14 @@ package body Sem_Ch13 is
Prepend (Aitem, Declarations (N)); Prepend (Aitem, Declarations (N));
elsif Nkind (N) = N_Generic_Package_Declaration then
if No (Visible_Declarations (Specification (N))) then
Set_Visible_Declarations (Specification (N), New_List);
end if;
Prepend (Aitem,
Visible_Declarations (Specification (N)));
else else
if No (Pragmas_After (Aux)) then if No (Pragmas_After (Aux)) then
Set_Pragmas_After (Aux, New_List); Set_Pragmas_After (Aux, New_List);
......
...@@ -16468,10 +16468,15 @@ package body Sem_Ch3 is ...@@ -16468,10 +16468,15 @@ package body Sem_Ch3 is
Type_Scope := Scope (Base_Type (Scope (C))); Type_Scope := Scope (Base_Type (Scope (C)));
end if; end if;
-- This test only concerns tagged types -- For an untagged type derived from a private type, the only
-- visible components are new discriminants.
if not Is_Tagged_Type (Original_Scope) then if not Is_Tagged_Type (Original_Scope) then
return True; return not Has_Private_Ancestor (Original_Scope)
or else In_Open_Scopes (Scope (Original_Scope))
or else
(Ekind (Original_Comp) = E_Discriminant
and then Original_Scope = Type_Scope);
-- If it is _Parent or _Tag, there is no visibility issue -- If it is _Parent or _Tag, there is no visibility issue
...@@ -17383,8 +17388,6 @@ package body Sem_Ch3 is ...@@ -17383,8 +17388,6 @@ package body Sem_Ch3 is
-- now. We have to create a new entity with the same name, Thus we -- now. We have to create a new entity with the same name, Thus we
-- can't use Create_Itype. -- can't use Create_Itype.
-- This is messy, should be fixed ???
Full := Make_Defining_Identifier (Sloc (Id), Chars (Id)); Full := Make_Defining_Identifier (Sloc (Id), Chars (Id));
Set_Is_Itype (Full); Set_Is_Itype (Full);
Set_Associated_Node_For_Itype (Full, Related_Nod); Set_Associated_Node_For_Itype (Full, Related_Nod);
......
...@@ -2499,7 +2499,8 @@ package body Sprint is ...@@ -2499,7 +2499,8 @@ package body Sprint is
Write_Str_With_Col_Check_Sloc ("package "); Write_Str_With_Col_Check_Sloc ("package ");
Sprint_Node (Defining_Unit_Name (Node)); Sprint_Node (Defining_Unit_Name (Node));
if Nkind (Parent (Node)) = N_Package_Declaration if Nkind_In (Parent (Node), N_Package_Declaration,
N_Generic_Package_Declaration)
and then Has_Aspects (Parent (Node)) and then Has_Aspects (Parent (Node))
then then
Sprint_Aspect_Specifications Sprint_Aspect_Specifications
...@@ -3304,7 +3305,10 @@ package body Sprint is ...@@ -3304,7 +3305,10 @@ package body Sprint is
-- Print aspects, except for special case of package declaration, -- Print aspects, except for special case of package declaration,
-- where the aspects are printed inside the package specification. -- where the aspects are printed inside the package specification.
if Has_Aspects (Node) and Nkind (Node) /= N_Package_Declaration then if Has_Aspects (Node)
and then not Nkind_In (Node, N_Package_Declaration,
N_Generic_Package_Declaration)
then
Sprint_Aspect_Specifications (Node, Semicolon => True); Sprint_Aspect_Specifications (Node, Semicolon => True);
end if; end if;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment