Commit b619c88e by Arnaud Charlet

[multiple changes]

2017-04-25  Hristian Kirtchev  <kirtchev@adacore.com>

	* elists.ads, elists.adb (Prepend_Unique_Elmt): New routine.
	* exp_ch3.adb (Freeze_Type): Signal the DIC body is created for
	the purposes of freezing.
	* exp_util.adb Update the documentation and structure of the
	type map used in class-wide semantics of assertion expressions.
	(Add_Inherited_Tagged_DIC): There is really no need to preanalyze
	and resolve the triaged expression because all substitutions
	refer to the proper entities.  Update the replacement of
	references.
	(Build_DIC_Procedure_Body): Add formal parameter
	For_Freeze. Add local variable Build_Body. Inherited DIC pragmas
	are now only processed when freezing occurs.  Build a body only
	when one is needed.
	(Entity_Hash): Removed.
	(Map_Types): New routine.
	(Replace_Object_And_Primitive_References): Removed.
	(Replace_References): New routine.
	(Replace_Type_References): Moved to the library level of Exp_Util.
	(Type_Map_Hash): New routine.
	(Update_Primitives_Mapping): Update the mapping call.
	(Update_Primitives_Mapping_Of_Types): Removed.
	* exp_util.ads (Build_DIC_Procedure_Body): Add formal
	parameter For_Freeze and update the comment on usage.
	(Map_Types): New routine.
	(Replace_References): New routine.
	(Replace_Type_References): Moved to the library level of Exp_Util.
	(Update_Primitives_Mapping_Of_Types): Removed.
	* sem_ch7.adb (Preserve_Full_Attributes): Propagate the DIC
	properties of the private type to the full view in case the full
	view derives from a parent type and inherits a DIC pragma.
	* sem_prag.adb (Analyze_Pragma): Guard against a case where a
	DIC pragma is placed at the top of a declarative region.

2017-04-25  Arnaud Charlet  <charlet@adacore.com trojanek>

	* a-tasatt.adb: Complete previous change and use an unsigned
	int to avoid overflow checks.

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

	* sem_attr.adb (Analyze_Attribute, case 'Access): Specialize
	the error message when the attribute reference is an actual in
	a call to a subprogram inherited from a generic formal type with
	unknown discriminants, which makes the subprogram and its formal
	parameters intrinsic (see RM 6.3.1 (8) and (13)).

From-SVN: r247148
parent 2bb988bb
2017-04-25 Hristian Kirtchev <kirtchev@adacore.com> 2017-04-25 Hristian Kirtchev <kirtchev@adacore.com>
* elists.ads, elists.adb (Prepend_Unique_Elmt): New routine.
* exp_ch3.adb (Freeze_Type): Signal the DIC body is created for
the purposes of freezing.
* exp_util.adb Update the documentation and structure of the
type map used in class-wide semantics of assertion expressions.
(Add_Inherited_Tagged_DIC): There is really no need to preanalyze
and resolve the triaged expression because all substitutions
refer to the proper entities. Update the replacement of
references.
(Build_DIC_Procedure_Body): Add formal parameter
For_Freeze. Add local variable Build_Body. Inherited DIC pragmas
are now only processed when freezing occurs. Build a body only
when one is needed.
(Entity_Hash): Removed.
(Map_Types): New routine.
(Replace_Object_And_Primitive_References): Removed.
(Replace_References): New routine.
(Replace_Type_References): Moved to the library level of Exp_Util.
(Type_Map_Hash): New routine.
(Update_Primitives_Mapping): Update the mapping call.
(Update_Primitives_Mapping_Of_Types): Removed.
* exp_util.ads (Build_DIC_Procedure_Body): Add formal
parameter For_Freeze and update the comment on usage.
(Map_Types): New routine.
(Replace_References): New routine.
(Replace_Type_References): Moved to the library level of Exp_Util.
(Update_Primitives_Mapping_Of_Types): Removed.
* sem_ch7.adb (Preserve_Full_Attributes): Propagate the DIC
properties of the private type to the full view in case the full
view derives from a parent type and inherits a DIC pragma.
* sem_prag.adb (Analyze_Pragma): Guard against a case where a
DIC pragma is placed at the top of a declarative region.
2017-04-25 Arnaud Charlet <charlet@adacore.com trojanek>
* a-tasatt.adb: Complete previous change and use an unsigned
int to avoid overflow checks.
2017-04-25 Ed Schonberg <schonberg@adacore.com>
* sem_attr.adb (Analyze_Attribute, case 'Access): Specialize
the error message when the attribute reference is an actual in
a call to a subprogram inherited from a generic formal type with
unknown discriminants, which makes the subprogram and its formal
parameters intrinsic (see RM 6.3.1 (8) and (13)).
2017-04-25 Hristian Kirtchev <kirtchev@adacore.com>
* sem_aggr.adb, inline.adb, einfo.adb, einfo.ads, scng.adb, * sem_aggr.adb, inline.adb, einfo.adb, einfo.ads, scng.adb,
sem_prag.adb: Minor reformatting. sem_prag.adb: Minor reformatting.
......
...@@ -93,10 +93,11 @@ package body Ada.Task_Attributes is ...@@ -93,10 +93,11 @@ package body Ada.Task_Attributes is
function To_Attribute is new function To_Attribute is new
Ada.Unchecked_Conversion (Atomic_Address, Attribute); Ada.Unchecked_Conversion (Atomic_Address, Attribute);
type Unsigned is mod 2 ** Integer'Size;
function To_Address is new function To_Address is new
Ada.Unchecked_Conversion (Attribute, System.Address); Ada.Unchecked_Conversion (Attribute, System.Address);
function To_Int is new function To_Unsigned is new
Ada.Unchecked_Conversion (Attribute, Integer); Ada.Unchecked_Conversion (Attribute, Unsigned);
pragma Warnings (On); pragma Warnings (On);
...@@ -121,7 +122,7 @@ package body Ada.Task_Attributes is ...@@ -121,7 +122,7 @@ package body Ada.Task_Attributes is
Fast_Path : constant Boolean := Fast_Path : constant Boolean :=
(Attribute'Size = Integer'Size (Attribute'Size = Integer'Size
and then Attribute'Alignment <= Atomic_Address'Alignment and then Attribute'Alignment <= Atomic_Address'Alignment
and then To_Int (Initial_Value) = 0) and then To_Unsigned (Initial_Value) = 0)
or else (Attribute'Size = System.Address'Size or else (Attribute'Size = System.Address'Size
and then Attribute'Alignment <= Atomic_Address'Alignment and then Attribute'Alignment <= Atomic_Address'Alignment
and then To_Address (Initial_Value) = System.Null_Address); and then To_Address (Initial_Value) = System.Null_Address);
...@@ -303,7 +304,7 @@ package body Ada.Task_Attributes is ...@@ -303,7 +304,7 @@ package body Ada.Task_Attributes is
-- No finalization needed, simply set to Val -- No finalization needed, simply set to Val
if Attribute'Size = Integer'Size then if Attribute'Size = Integer'Size then
TT.Attributes (Index) := Atomic_Address (To_Int (Val)); TT.Attributes (Index) := Atomic_Address (To_Unsigned (Val));
else else
TT.Attributes (Index) := To_Address (Val); TT.Attributes (Index) := To_Address (Val);
end if; end if;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2015, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2016, 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- --
...@@ -450,6 +450,17 @@ package body Elists is ...@@ -450,6 +450,17 @@ package body Elists is
Elists.Table (To).First := Elmts.Last; Elists.Table (To).First := Elmts.Last;
end Prepend_Elmt; end Prepend_Elmt;
-------------------------
-- Prepend_Unique_Elmt --
-------------------------
procedure Prepend_Unique_Elmt (N : Node_Or_Entity_Id; To : Elist_Id) is
begin
if not Contains (To, N) then
Prepend_Elmt (N, To);
end if;
end Prepend_Unique_Elmt;
------------- -------------
-- Present -- -- Present --
------------- -------------
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1992-2015, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2016, 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- --
...@@ -141,6 +141,10 @@ package Elists is ...@@ -141,6 +141,10 @@ package Elists is
procedure Prepend_Elmt (N : Node_Or_Entity_Id; To : Elist_Id); procedure Prepend_Elmt (N : Node_Or_Entity_Id; To : Elist_Id);
-- Appends N at the beginning of To, allocating a new element -- Appends N at the beginning of To, allocating a new element
procedure Prepend_Unique_Elmt (N : Node_Or_Entity_Id; To : Elist_Id);
-- Like Prepend_Elmt, except that a check is made to see if To already
-- contains N and if so the call has no effect.
procedure Insert_Elmt_After (N : Node_Or_Entity_Id; Elmt : Elmt_Id); procedure Insert_Elmt_After (N : Node_Or_Entity_Id; Elmt : Elmt_Id);
-- Add a new element (N) right after the pre-existing element Elmt -- Add a new element (N) right after the pre-existing element Elmt
-- It is invalid to call this subprogram with Elmt = No_Elmt. -- It is invalid to call this subprogram with Elmt = No_Elmt.
......
...@@ -7515,7 +7515,7 @@ package body Exp_Ch3 is ...@@ -7515,7 +7515,7 @@ package body Exp_Ch3 is
-- verification of pragma Default_Initial_Condition's expression. -- verification of pragma Default_Initial_Condition's expression.
if Has_DIC (Def_Id) then if Has_DIC (Def_Id) then
Build_DIC_Procedure_Body (Def_Id); Build_DIC_Procedure_Body (Def_Id, For_Freeze => True);
end if; end if;
-- Generate the [spec and] body of the invariant procedure tasked with -- Generate the [spec and] body of the invariant procedure tasked with
......
...@@ -278,9 +278,13 @@ package Exp_Util is ...@@ -278,9 +278,13 @@ package Exp_Util is
-- Build a call to the DIC procedure of type Typ with Obj_Id as the actual -- Build a call to the DIC procedure of type Typ with Obj_Id as the actual
-- parameter. -- parameter.
procedure Build_DIC_Procedure_Body (Typ : Entity_Id); procedure Build_DIC_Procedure_Body
(Typ : Entity_Id;
For_Freeze : Boolean := False);
-- Create the body of the procedure which verifies the assertion expression -- Create the body of the procedure which verifies the assertion expression
-- of pragma Default_Initial_Condition at run time. -- of pragma Default_Initial_Condition at run time. Flag For_Freeze should
-- be set when the body is construction as part of the freezing actions for
-- Typ.
procedure Build_DIC_Procedure_Declaration (Typ : Entity_Id); procedure Build_DIC_Procedure_Declaration (Typ : Entity_Id);
-- Create the declaration of the procedure which verifies the assertion -- Create the declaration of the procedure which verifies the assertion
...@@ -870,6 +874,19 @@ package Exp_Util is ...@@ -870,6 +874,19 @@ package Exp_Util is
-- wide type. Set Related_Id to request an external name for the subtype -- wide type. Set Related_Id to request an external name for the subtype
-- rather than an internal temporary. -- rather than an internal temporary.
procedure Map_Types (Parent_Type : Entity_Id; Derived_Type : Entity_Id);
-- Establish the following mapping between the attributes of tagged parent
-- type Parent_Type and tagged derived type Derived_Type.
--
-- * Map each discriminant of Parent_Type to ether the corresponding
-- discriminant of Derived_Type or come constraint.
-- * Map each primitive operation of Parent_Type to the corresponding
-- primitive of Derived_Type.
--
-- The mapping Parent_Type -> Derived_Type is also added to the table in
-- order to prevent subsequent attempts of the same mapping.
function Matching_Standard_Type (Typ : Entity_Id) return Entity_Id; function Matching_Standard_Type (Typ : Entity_Id) return Entity_Id;
-- Given a scalar subtype Typ, returns a matching type in standard that -- Given a scalar subtype Typ, returns a matching type in standard that
-- has the same object size value. For example, a 16 bit signed type will -- has the same object size value. For example, a 16 bit signed type will
...@@ -995,6 +1012,37 @@ package Exp_Util is ...@@ -995,6 +1012,37 @@ package Exp_Util is
-- renaming cannot be elaborated without evaluating the subexpression, so -- renaming cannot be elaborated without evaluating the subexpression, so
-- gigi would resort to method 1) or 3) under the hood for them. -- gigi would resort to method 1) or 3) under the hood for them.
procedure Replace_References
(Expr : Node_Id;
Par_Typ : Entity_Id;
Deriv_Typ : Entity_Id;
Par_Obj : Entity_Id := Empty;
Deriv_Obj : Entity_Id := Empty);
-- Expr denotes an arbitrary expression. Par_Typ is a tagged parent type
-- in a type hierarchy. Deriv_Typ is a tagged type derived from Par_Typ
-- with optional ancestors in between. Par_Obj is a formal parameter
-- which emulates the current instance of Par_Typ. Deriv_Obj is a formal
-- parameter which emulates the current instance of Deriv_Typ. Perform the
-- following substitutions in Expr:
--
-- * Replace a reference to Par_Obj with a reference to Deriv_Obj
--
-- * Replace a reference to a discriminant of Par_Typ with a suitable
-- value from the point of view of Deriv_Typ.
--
-- * Replace a call to an overridden primitive of Par_Typ with a call to
-- an overriding primitive of Deriv_Typ.
--
-- * Replace a call to an inherited primitive of Par_Type with a call to
-- the internally-generated inherited primitive of Deriv_Typ.
procedure Replace_Type_References
(Expr : Node_Id;
Typ : Entity_Id;
Obj_Id : Entity_Id);
-- Substitute all references of the current instance of type Typ with
-- references to formal parameter Obj_Id within expression Expr.
function Represented_As_Scalar (T : Entity_Id) return Boolean; function Represented_As_Scalar (T : Entity_Id) return Boolean;
-- Returns True iff the implementation of this type in code generation -- Returns True iff the implementation of this type in code generation
-- terms is scalar. This is true for scalars in the Ada sense, and for -- terms is scalar. This is true for scalars in the Ada sense, and for
...@@ -1103,12 +1151,6 @@ package Exp_Util is ...@@ -1103,12 +1151,6 @@ package Exp_Util is
-- when elaborating a contract for a subprogram, and when freezing a type -- when elaborating a contract for a subprogram, and when freezing a type
-- extension to verify legality rules on inherited conditions. -- extension to verify legality rules on inherited conditions.
procedure Update_Primitives_Mapping_Of_Types
(Par_Typ : Entity_Id;
Deriv_Typ : Entity_Id);
-- Map the primitive operations of parent type Par_Typ to the corresponding
-- primitives of derived type Deriv_Typ.
function Within_Case_Or_If_Expression (N : Node_Id) return Boolean; function Within_Case_Or_If_Expression (N : Node_Id) return Boolean;
-- Determine whether arbitrary node N is within a case or an if expression -- Determine whether arbitrary node N is within a case or an if expression
......
...@@ -10532,10 +10532,33 @@ package body Sem_Attr is ...@@ -10532,10 +10532,33 @@ package body Sem_Attr is
if Convention (Designated_Type (Btyp)) /= if Convention (Designated_Type (Btyp)) /=
Convention (Entity (P)) Convention (Entity (P))
then then
Error_Msg_FE -- The rule in 6.3.1 (8) deserves a special error
("subprogram & has wrong convention", P, Entity (P)); -- message.
Error_Msg_Sloc := Sloc (Btyp);
Error_Msg_FE ("\does not match & declared#", P, Btyp); if Convention (Btyp) = Convention_Intrinsic
and then Nkind (Parent (N)) = N_Procedure_Call_Statement
and then Is_Entity_Name (Name (Parent (N)))
and then Inside_A_Generic
then
declare
Subp : constant Entity_Id :=
Entity (Name (Parent (N)));
begin
if Convention (Subp) = Convention_Intrinsic then
Error_Msg_FE ("subprogram and its formal "
& "parameters have convention Intrinsic",
Parent (N), Subp);
Error_Msg_N
("actual cannot be access attribute", N);
end if;
end;
else
Error_Msg_FE
("subprogram & has wrong convention", P, Entity (P));
Error_Msg_Sloc := Sloc (Btyp);
Error_Msg_FE ("\does not match & declared#", P, Btyp);
end if;
if not Is_Itype (Btyp) if not Is_Itype (Btyp)
and then not Has_Convention_Pragma (Btyp) and then not Has_Convention_Pragma (Btyp)
......
...@@ -2568,6 +2568,11 @@ package body Sem_Ch7 is ...@@ -2568,6 +2568,11 @@ package body Sem_Ch7 is
Propagate_DIC_Attributes (Full, From_Typ => Full_Base); Propagate_DIC_Attributes (Full, From_Typ => Full_Base);
Propagate_DIC_Attributes (Full_Base, From_Typ => Full); Propagate_DIC_Attributes (Full_Base, From_Typ => Full);
-- Propagate Default_Initial_Condition-related attributes from the
-- full view to the private view.
Propagate_DIC_Attributes (Priv, From_Typ => Full);
-- Propagate invariant-related attributes from the base type of the -- Propagate invariant-related attributes from the base type of the
-- full view to the full view and vice versa. This may seem strange, -- full view to the full view and vice versa. This may seem strange,
-- but is necessary depending on which type triggered the generation -- but is necessary depending on which type triggered the generation
......
...@@ -13839,6 +13839,7 @@ package body Sem_Prag is ...@@ -13839,6 +13839,7 @@ package body Sem_Prag is
Check_No_Identifiers; Check_No_Identifiers;
Check_At_Most_N_Arguments (1); Check_At_Most_N_Arguments (1);
Typ := Empty;
Stmt := Prev (N); Stmt := Prev (N);
while Present (Stmt) loop while Present (Stmt) loop
...@@ -13880,6 +13881,14 @@ package body Sem_Prag is ...@@ -13880,6 +13881,14 @@ package body Sem_Prag is
Stmt := Prev (Stmt); Stmt := Prev (Stmt);
end loop; end loop;
-- The pragma does not apply to a legal construct, issue an error
-- and stop the analysis.
if No (Typ) then
Pragma_Misplaced;
return;
end if;
-- A pragma that applies to a Ghost entity becomes Ghost for the -- A pragma that applies to a Ghost entity becomes Ghost for the
-- purposes of legality checks and removal of ignored Ghost code. -- purposes of legality checks and removal of ignored Ghost code.
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