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,6 +8068,12 @@ package body Sem_Ch13 is ...@@ -8066,6 +8068,12 @@ 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);
-- Both modifications performed below are not done for inherited
-- class-wide invariants because the origial aspect/pragma of the
-- parent type must remain unchanged.
if not Inherit then
-- A class-wide invariant may be inherited in a separate unit, -- A class-wide invariant may be inherited in a separate unit,
-- where the corresponding expression cannot be resolved by -- where the corresponding expression cannot be resolved by
-- visibility, because it refers to a local function. Propagate -- visibility, because it refers to a local function. Propagate
...@@ -8076,8 +8084,7 @@ package body Sem_Ch13 is ...@@ -8076,8 +8084,7 @@ package body Sem_Ch13 is
-- ??? Unclear how to handle class-wide invariants that are not -- ??? Unclear how to handle class-wide invariants that are not
-- function calls. -- function calls.
if not Inherit if Class_Present (Prag)
and then Class_Present (Prag)
and then Nkind (Expr) = N_Function_Call and then Nkind (Expr) = N_Function_Call
and then Nkind (Arg2) = N_Indexed_Component and then Nkind (Arg2) = N_Indexed_Component
then then
...@@ -8085,8 +8092,7 @@ package body Sem_Ch13 is ...@@ -8085,8 +8092,7 @@ package body Sem_Ch13 is
Make_Function_Call (Ploc, Make_Function_Call (Ploc,
Name => Name =>
New_Occurrence_Of (Entity (Name (Expr)), Ploc), New_Occurrence_Of (Entity (Name (Expr)), Ploc),
Parameter_Associations => Parameter_Associations => Expressions (Arg2)));
New_Copy_List (Expressions (Arg2))));
end if; end if;
-- In ASIS mode, even if assertions are not enabled, we must -- In ASIS mode, even if assertions are not enabled, we must
...@@ -8095,12 +8101,14 @@ package body Sem_Ch13 is ...@@ -8095,12 +8101,14 @@ package body Sem_Ch13 is
if ASIS_Mode and then Present (Asp) then if ASIS_Mode and then Present (Asp) then
declare declare
Orig_Expr : constant Node_Id := Expression (Asp); Asp_Expr : constant Node_Id := Expression (Asp);
begin begin
Replace_Type_References (Orig_Expr, T); Replace_Type_References (Asp_Expr, T);
Preanalyze_Assert_Expression (Orig_Expr, Any_Boolean); Preanalyze_Assert_Expression (Asp_Expr, Any_Boolean);
end; 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
-- null statement to ensure that the invariant procedure does get -- null statement to ensure that the invariant procedure does get
......
...@@ -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