[multiple changes]
2016-04-18 Ed Schonberg <schonberg@adacore.com> * sem_ch4.adb (Analyze_Selected_Component, Has_Dereference): Refine check on illegal calls to entities within a task body, when the entity is declared in an object of the same type. In a generic context there might be no explicit dereference but if the prefix includes an access type the construct is legal. 2016-04-18 Arnaud Charlet <charlet@adacore.com> * rtsfind.ads, rtsfind.adb (RE_Id, RE_Unit_Table): add RE_Default_Priority. 2016-04-18 Bob Duff <duff@adacore.com> * sem_prag.adb (Check_Arg_Is_Local_Name): Don't do the check if the pragma came from an aspect specification. 2016-04-18 Gary Dismukes <dismukes@adacore.com> * gnat1drv.adb, contracts.adb: Minor reformatting and wording fixes. 2016-04-18 Ed Schonberg <schonberg@adacore.com> * sem_ch6.adb (Analyze_Subprogram_Body_Helper): To suppress superfluous conformance check on an inlined body with a previous spec, use the fact that the generated declaration does not come from source. We must treat the entity as coming from source to enable some back-end inlining when pragma appears after the body. From-SVN: r235136
This commit is contained in:
parent
4afcf3a5a0
commit
a6363ed30e
@ -1,3 +1,33 @@
|
||||
2016-04-18 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* sem_ch4.adb (Analyze_Selected_Component, Has_Dereference):
|
||||
Refine check on illegal calls to entities within a task body,
|
||||
when the entity is declared in an object of the same type. In
|
||||
a generic context there might be no explicit dereference but if
|
||||
the prefix includes an access type the construct is legal.
|
||||
|
||||
2016-04-18 Arnaud Charlet <charlet@adacore.com>
|
||||
|
||||
* rtsfind.ads, rtsfind.adb (RE_Id, RE_Unit_Table): add
|
||||
RE_Default_Priority.
|
||||
|
||||
2016-04-18 Bob Duff <duff@adacore.com>
|
||||
|
||||
* sem_prag.adb (Check_Arg_Is_Local_Name): Don't do the check
|
||||
if the pragma came from an aspect specification.
|
||||
|
||||
2016-04-18 Gary Dismukes <dismukes@adacore.com>
|
||||
|
||||
* gnat1drv.adb, contracts.adb: Minor reformatting and wording fixes.
|
||||
|
||||
2016-04-18 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): To suppress
|
||||
superfluous conformance check on an inlined body with a previous
|
||||
spec, use the fact that the generated declaration does not come
|
||||
from source. We must treat the entity as coming from source to
|
||||
enable some back-end inlining when pragma appears after the body.
|
||||
|
||||
2016-04-18 Gary Dismukes <dismukes@adacore.com>
|
||||
|
||||
* lib-xref-spark_specific.adb, par-ch2.adb, errout.ads,
|
||||
|
@ -2010,6 +2010,10 @@ package body Contracts is
|
||||
-- The insertion node after which all pragma Check equivalents are
|
||||
-- inserted.
|
||||
|
||||
function Is_Prologue_Renaming (Decl : Node_Id) return Boolean;
|
||||
-- Determine whether arbitrary declaration Decl denotes a renaming of
|
||||
-- a discriminant or protection field _object.
|
||||
|
||||
procedure Merge_Preconditions (From : Node_Id; Into : Node_Id);
|
||||
-- Merge two class-wide preconditions by "or else"-ing them. The
|
||||
-- changes are accumulated in parameter Into. Update the error
|
||||
@ -2030,6 +2034,52 @@ package body Contracts is
|
||||
-- Collect all preconditions of subprogram Subp_Id and prepend their
|
||||
-- pragma Check equivalents to the declarations of the body.
|
||||
|
||||
--------------------------
|
||||
-- Is_Prologue_Renaming --
|
||||
--------------------------
|
||||
|
||||
function Is_Prologue_Renaming (Decl : Node_Id) return Boolean is
|
||||
Nam : Node_Id;
|
||||
Obj : Entity_Id;
|
||||
Pref : Node_Id;
|
||||
Sel : Node_Id;
|
||||
|
||||
begin
|
||||
if Nkind (Decl) = N_Object_Renaming_Declaration then
|
||||
Obj := Defining_Entity (Decl);
|
||||
Nam := Name (Decl);
|
||||
|
||||
if Nkind (Nam) = N_Selected_Component then
|
||||
Pref := Prefix (Nam);
|
||||
Sel := Selector_Name (Nam);
|
||||
|
||||
-- A discriminant renaming appears as
|
||||
-- Discr : constant ... := Prefix.Discr;
|
||||
|
||||
if Ekind (Obj) = E_Constant
|
||||
and then Is_Entity_Name (Sel)
|
||||
and then Present (Entity (Sel))
|
||||
and then Ekind (Entity (Sel)) = E_Discriminant
|
||||
then
|
||||
return True;
|
||||
|
||||
-- A protection field renaming appears as
|
||||
-- Prot : ... := _object._object;
|
||||
|
||||
elsif Ekind (Obj) = E_Variable
|
||||
and then Nkind (Pref) = N_Identifier
|
||||
and then Chars (Pref) = Name_uObject
|
||||
and then Nkind (Sel) = N_Identifier
|
||||
and then Chars (Sel) = Name_uObject
|
||||
then
|
||||
return True;
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
return False;
|
||||
end Is_Prologue_Renaming;
|
||||
|
||||
-------------------------
|
||||
-- Merge_Preconditions --
|
||||
-------------------------
|
||||
@ -2278,15 +2328,34 @@ package body Contracts is
|
||||
-- Start of processing for Process_Preconditions
|
||||
|
||||
begin
|
||||
-- Find the last internally generated declaration, starting from the
|
||||
-- top of the body declarations. This ensures that discriminals and
|
||||
-- subtypes are properly visible to the pragma Check equivalents.
|
||||
-- Find the proper insertion point for all pragma Check equivalents
|
||||
|
||||
if Present (Decls) then
|
||||
Decl := First (Decls);
|
||||
while Present (Decl) loop
|
||||
exit when Comes_From_Source (Decl);
|
||||
Insert_Node := Decl;
|
||||
|
||||
-- First source declaration terminates the search, because all
|
||||
-- preconditions must be evaluated prior to it, by definition.
|
||||
|
||||
if Comes_From_Source (Decl) then
|
||||
exit;
|
||||
|
||||
-- Certain internally generated object renamings such as those
|
||||
-- for discriminants and protection fields must be elaborated
|
||||
-- before the preconditions are evaluated, as their expressions
|
||||
-- may mention the discriminants.
|
||||
|
||||
elsif Is_Prologue_Renaming (Decl) then
|
||||
Insert_Node := Decl;
|
||||
|
||||
-- Otherwise the declaration does not come from source. This
|
||||
-- also terminates the search, because internal code may raise
|
||||
-- exceptions which should not preempt the preconditions.
|
||||
|
||||
else
|
||||
exit;
|
||||
end if;
|
||||
|
||||
Next (Decl);
|
||||
end loop;
|
||||
end if;
|
||||
|
@ -1047,7 +1047,7 @@ begin
|
||||
|
||||
-- In GNATprove mode, force loading of System unit to ensure that
|
||||
-- System.Interrupt_Priority is available to GNATprove for the
|
||||
-- generation of VCs for related to Ceiling Priority.
|
||||
-- generation of VCs related to ceiling priority.
|
||||
|
||||
if GNATprove_Mode then
|
||||
declare
|
||||
|
@ -725,6 +725,7 @@ package Rtsfind is
|
||||
RE_Address, -- System
|
||||
RE_Any_Priority, -- System
|
||||
RE_Bit_Order, -- System
|
||||
RE_Default_Priority, -- System
|
||||
RE_High_Order_First, -- System
|
||||
RE_Interrupt_Priority, -- System
|
||||
RE_Lib_Stop, -- System
|
||||
@ -1957,6 +1958,7 @@ package Rtsfind is
|
||||
RE_Address => System,
|
||||
RE_Any_Priority => System,
|
||||
RE_Bit_Order => System,
|
||||
RE_Default_Priority => System,
|
||||
RE_High_Order_First => System,
|
||||
RE_Interrupt_Priority => System,
|
||||
RE_Lib_Stop => System,
|
||||
|
@ -4221,6 +4221,13 @@ package body Sem_Ch4 is
|
||||
if Nkind (Nod) = N_Explicit_Dereference then
|
||||
return True;
|
||||
|
||||
-- When expansion is disabled an explicit dereference may not have
|
||||
-- been inserted, but if this is an access type the indirection makes
|
||||
-- the call safe.
|
||||
|
||||
elsif Is_Access_Type (Etype (Nod)) then
|
||||
return True;
|
||||
|
||||
elsif Nkind_In (Nod, N_Indexed_Component, N_Selected_Component) then
|
||||
return Has_Dereference (Prefix (Nod));
|
||||
|
||||
|
@ -3378,10 +3378,13 @@ package body Sem_Ch6 is
|
||||
Conformant := True;
|
||||
|
||||
-- Conversely, the spec may have been generated for specless body
|
||||
-- with an inline pragma.
|
||||
-- with an inline pragma. The entity comes from source, which is
|
||||
-- both semantically correct and necessary for proper inlining.
|
||||
-- The subprogram declaration itself is not in the source.
|
||||
|
||||
elsif Comes_From_Source (N)
|
||||
and then not Comes_From_Source (Spec_Id)
|
||||
and then Present (Spec_Decl)
|
||||
and then not Comes_From_Source (Spec_Decl)
|
||||
and then Has_Pragma_Inline (Spec_Id)
|
||||
then
|
||||
Conformant := True;
|
||||
|
@ -4539,6 +4539,25 @@ package body Sem_Prag is
|
||||
Argx : constant Node_Id := Get_Pragma_Arg (Arg);
|
||||
|
||||
begin
|
||||
-- If this pragma came from an aspect specification, we don't want to
|
||||
-- check for this error, because that would cause spurious errors, in
|
||||
-- case a type is frozen in a scope more nested than the type. The
|
||||
-- aspect itself of course can't be anywhere but on the declaration
|
||||
-- itself.
|
||||
|
||||
if Nkind (Arg) = N_Pragma_Argument_Association then
|
||||
if From_Aspect_Specification (Parent (Arg)) then
|
||||
return;
|
||||
end if;
|
||||
|
||||
-- Arg is the Expression of an N_Pragma_Argument_Association
|
||||
|
||||
else
|
||||
if From_Aspect_Specification (Parent (Parent (Arg))) then
|
||||
return;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
Analyze (Argx);
|
||||
|
||||
if Nkind (Argx) not in N_Direct_Name
|
||||
|
Loading…
Reference in New Issue
Block a user