Commit 776fbb74 by Arnaud Charlet

[multiple changes]

2016-04-20  Hristian Kirtchev  <kirtchev@adacore.com>

	* sem_ch13.adb (Add_Invariant): Do not replace
	the saved expression of an invariatn aspect when inheriting
	a class-wide type invariant as this clobbers the existing
	expression. Do not use New_Copy_List as it is unnecessary
	and leaves the parent pointers referencing the wrong part of
	the tree. Do not replace the type references for ASIS when
	inheriting a class-wide type invariant as this clobbers the
	existing replacement.

2016-04-20  Ed Schonberg  <schonberg@adacore.com>

	* sem_util.adb (Build_Explicit_Dereference): If the designated
	expression is an entity name, generate reference to the entity
	because it will not be resolved again.

From-SVN: r235238
parent 60d393e8
2016-04-20 Hristian Kirtchev <kirtchev@adacore.com>
* sem_ch13.adb (Add_Invariant): Do not replace
the saved expression of an invariatn aspect when inheriting
a class-wide type invariant as this clobbers the existing
expression. Do not use New_Copy_List as it is unnecessary
and leaves the parent pointers referencing the wrong part of
the tree. Do not replace the type references for ASIS when
inheriting a class-wide type invariant as this clobbers the
existing replacement.
2016-04-20 Ed Schonberg <schonberg@adacore.com>
* sem_util.adb (Build_Explicit_Dereference): If the designated
expression is an entity name, generate reference to the entity
because it will not be resolved again.
2016-04-19 Arnaud Charlet <charlet@adacore.com> 2016-04-19 Arnaud Charlet <charlet@adacore.com>
* doc/gnat_rm/standard_and_implementation_defined_restrictions.rst, * doc/gnat_rm/standard_and_implementation_defined_restrictions.rst,
......
...@@ -8048,9 +8048,11 @@ package body Sem_Ch13 is ...@@ -8048,9 +8048,11 @@ package body Sem_Ch13 is
-- If the invariant pragma comes from an aspect, replace the saved -- If the invariant pragma comes from an aspect, replace the saved
-- expression because we need the subtype references replaced for -- expression because we need the subtype references replaced for
-- the calls to Preanalyze_Spec_Expression in Check_Aspect_At_xxx -- the calls to Preanalyze_Spec_Expression in Check_Aspect_At_xxx
-- routines. -- routines. This is not done for interited class-wide invariants
-- because the original pragma of the parent type must remain
-- unchanged.
if Present (Asp) then if not Inherit and then Present (Asp) then
Set_Entity (Identifier (Asp), New_Copy_Tree (Expr)); Set_Entity (Identifier (Asp), New_Copy_Tree (Expr));
end if; end if;
...@@ -8066,40 +8068,46 @@ package body Sem_Ch13 is ...@@ -8066,40 +8068,46 @@ package body Sem_Ch13 is
Set_Parent (Expr, Parent (Arg2)); Set_Parent (Expr, Parent (Arg2));
Preanalyze_Assert_Expression (Expr, Any_Boolean); Preanalyze_Assert_Expression (Expr, Any_Boolean);
-- A class-wide invariant may be inherited in a separate unit, -- Both modifications performed below are not done for inherited
-- where the corresponding expression cannot be resolved by -- class-wide invariants because the origial aspect/pragma of the
-- visibility, because it refers to a local function. Propagate -- parent type must remain unchanged.
-- semantic information to the original representation item, to
-- be used when an invariant procedure for a derived type is
-- constructed.
-- ??? Unclear how to handle class-wide invariants that are not if not Inherit then
-- function calls.
if not Inherit -- A class-wide invariant may be inherited in a separate unit,
and then Class_Present (Prag) -- where the corresponding expression cannot be resolved by
and then Nkind (Expr) = N_Function_Call -- visibility, because it refers to a local function. Propagate
and then Nkind (Arg2) = N_Indexed_Component -- semantic information to the original representation item, to
then -- be used when an invariant procedure for a derived type is
Rewrite (Arg2, -- constructed.
Make_Function_Call (Ploc,
Name =>
New_Occurrence_Of (Entity (Name (Expr)), Ploc),
Parameter_Associations =>
New_Copy_List (Expressions (Arg2))));
end if;
-- In ASIS mode, even if assertions are not enabled, we must -- ??? Unclear how to handle class-wide invariants that are not
-- analyze the original expression in the aspect specification -- function calls.
-- because it is part of the original tree.
if ASIS_Mode and then Present (Asp) then if Class_Present (Prag)
declare and then Nkind (Expr) = N_Function_Call
Orig_Expr : constant Node_Id := Expression (Asp); and then Nkind (Arg2) = N_Indexed_Component
begin then
Replace_Type_References (Orig_Expr, T); Rewrite (Arg2,
Preanalyze_Assert_Expression (Orig_Expr, Any_Boolean); Make_Function_Call (Ploc,
end; Name =>
New_Occurrence_Of (Entity (Name (Expr)), Ploc),
Parameter_Associations => Expressions (Arg2)));
end if;
-- In ASIS mode, even if assertions are not enabled, we must
-- analyze the original expression in the aspect specification
-- because it is part of the original tree.
if ASIS_Mode and then Present (Asp) then
declare
Asp_Expr : constant Node_Id := Expression (Asp);
begin
Replace_Type_References (Asp_Expr, T);
Preanalyze_Assert_Expression (Asp_Expr, Any_Boolean);
end;
end if;
end if; end if;
-- An ignored invariant must not generate a runtime check. Add a -- An ignored invariant must not generate a runtime check. Add a
......
...@@ -1759,6 +1759,11 @@ package body Sem_Util is ...@@ -1759,6 +1759,11 @@ package body Sem_Util is
if Is_Entity_Name (Expr) then if Is_Entity_Name (Expr) then
Set_Etype (Expr, Etype (Entity (Expr))); Set_Etype (Expr, Etype (Entity (Expr)));
-- The designated entity will not be examined again when resolving
-- the dereference, so generate a reference to it now.
Generate_Reference (Entity (Expr), Expr);
elsif Nkind (Expr) = N_Function_Call then elsif Nkind (Expr) = N_Function_Call then
-- If the name of the indexing function is overloaded, locate the one -- If the name of the indexing function is overloaded, locate the one
......
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