From: Ronan Desplanques <[email protected]>
When the parser encounters the word "finally", it first considers it an
identifier and then looks ahead and possibly recategorizes it as a
keyword. The expected level of indentation depends on the final verdict,
but indentation checks were performed right away. This patch fixes the
issue by delaying the checks appropriately.
gcc/ada/ChangeLog:
* par.adb, par-util.adb (Check_Bad_Layout_At): New procedure.
* par-ch3.adb (P_Declarative_Item): Use new procedure.
* par-ch5.adb (P_Sequence_Of_Statements): Likewise.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/par-ch3.adb | 6 +++++-
gcc/ada/par-ch5.adb | 4 ++--
gcc/ada/par-util.adb | 13 +++++++++++++
gcc/ada/par.adb | 3 +++
4 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/gcc/ada/par-ch3.adb b/gcc/ada/par-ch3.adb
index 77c6f12691a..c2f8eaf6c9d 100644
--- a/gcc/ada/par-ch3.adb
+++ b/gcc/ada/par-ch3.adb
@@ -4613,7 +4613,7 @@ package body Ch3 is
Append (P_Generic, Decls);
when Tok_Identifier =>
- Check_Bad_Layout;
+ Save_Scan_State (Scan_State);
-- Special check for misuse of overriding not in Ada 2005 mode
@@ -4632,6 +4632,10 @@ package body Ch3 is
P_Identifier_Declarations (Decls, Done, In_Spec, In_Statements);
end if;
+ if not Done then
+ Check_Bad_Layout_At (Scan_State);
+ end if;
+
when Tok_Package =>
Check_Bad_Layout;
Append (P_Package (Pf_Decl_Gins_Pbod_Rnam_Stub_Pexp), Decls);
diff --git a/gcc/ada/par-ch5.adb b/gcc/ada/par-ch5.adb
index f66d77314f3..053b6d7ca16 100644
--- a/gcc/ada/par-ch5.adb
+++ b/gcc/ada/par-ch5.adb
@@ -497,8 +497,6 @@ package body Ch5 is
-- Cases of statements starting with an identifier
when Tok_Identifier =>
- Check_Bad_Layout;
-
-- Save scan pointers and line number in case block label
Id_Node := Token_Node;
@@ -802,6 +800,8 @@ package body Ch5 is
end if;
end if;
+ Check_Bad_Layout_At (Scan_State_Label);
+
-- Statement starting with operator symbol. This could be
-- a call, a name starting an assignment, or a qualified
-- expression.
diff --git a/gcc/ada/par-util.adb b/gcc/ada/par-util.adb
index 790d238696c..e5ee0fb8899 100644
--- a/gcc/ada/par-util.adb
+++ b/gcc/ada/par-util.adb
@@ -197,6 +197,19 @@ package body Util is
end if;
end Check_Bad_Layout;
+ -------------------------
+ -- Check_Bad_Layout_At --
+ -------------------------
+
+ procedure Check_Bad_Layout_At (Scan_State : Saved_Scan_State) is
+ S : Saved_Scan_State;
+ begin
+ Save_Scan_State (S);
+ Restore_Scan_State (Scan_State);
+ Check_Bad_Layout;
+ Restore_Scan_State (S);
+ end Check_Bad_Layout_At;
+
--------------------------
-- Check_Future_Keyword --
--------------------------
diff --git a/gcc/ada/par.adb b/gcc/ada/par.adb
index 4fe825b57af..53966bc4c77 100644
--- a/gcc/ada/par.adb
+++ b/gcc/ada/par.adb
@@ -1324,6 +1324,9 @@ function Par (Configuration_Pragmas : Boolean) return
List_Id is
-- is exdented from the current expected end column, and if so an
-- error message is generated.
+ procedure Check_Bad_Layout_At (Scan_State : Saved_Scan_State);
+ -- Same as Check_Bad_Layout with Scan_State as the current scan state
+
procedure Check_Misspelling_Of (T : Token_Type);
pragma Inline (Check_Misspelling_Of);
-- This is similar to the function above, except that it does not
--
2.53.0