sem_ch5.adb: Improve error recovery.

2014-07-30  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch5.adb: Improve error recovery.
	* inline.adb (Build_Body_To_Inline): Set Full_Analysis to false
	before analyzing the body, so that in GNATprove mode there is
	no light expansion. Whatever expansion is required by SPARK will
	be performed when analysing the inlined code.

From-SVN: r213267
This commit is contained in:
Ed Schonberg 2014-07-30 13:46:35 +00:00 committed by Arnaud Charlet
parent 2afa8fdd1b
commit 274d2584e5
3 changed files with 22 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2014-07-30 Ed Schonberg <schonberg@adacore.com>
* sem_ch5.adb: Improve error recovery.
* inline.adb (Build_Body_To_Inline): Set Full_Analysis to false
before analyzing the body, so that in GNATprove mode there is
no light expansion. Whatever expansion is required by SPARK will
be performed when analysing the inlined code.
2014-07-30 Bob Duff <duff@adacore.com>
* s-tataat.adb, s-tataat.ads, a-tasatt.adb: Minor comment fixes.

View File

@ -833,6 +833,7 @@ package body Inline is
procedure Build_Body_To_Inline (N : Node_Id; Subp : Entity_Id) is
Decl : constant Node_Id := Unit_Declaration_Node (Subp);
Analysis_Status : constant Boolean := Full_Analysis;
Original_Body : Node_Id;
Body_To_Analyze : Node_Id;
Max_Size : constant := 10;
@ -1388,7 +1389,12 @@ package body Inline is
Append (Body_To_Analyze, Declarations (N));
end if;
-- The body to inline is pre-analyzed. In GNATprove mode we must
-- disable full analysis as well so that light expansion does not
-- take place either, and name resolution is unaffected.
Expander_Mode_Save_And_Set (False);
Full_Analysis := False;
Remove_Pragmas;
Analyze (Body_To_Analyze);
@ -1398,6 +1404,7 @@ package body Inline is
Remove (Body_To_Analyze);
Expander_Mode_Restore;
Full_Analysis := Analysis_Status;
-- Restore environment if previously saved

View File

@ -2841,6 +2841,13 @@ package body Sem_Ch5 is
Error_Msg_Sloc := Sloc (Ent);
Error_Msg_N ("implicit label declaration for & is hidden#", Id);
if Present (Homonym (Ent))
and then Ekind (Homonym (Ent)) = E_Label
then
Set_Entity (Id, Ent);
Set_Ekind (Ent, E_Loop);
end if;
else
Generate_Reference (Ent, N, ' ');
Generate_Definition (Ent);