par-ch10.adb (P_Compilation_Unit): Add defenses against junk unit syntax, which could...
authorRobert Dewar <dewar@adacore.com>
Tue, 15 Nov 2005 14:01:09 +0000 (15:01 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 15 Nov 2005 14:01:09 +0000 (15:01 +0100)
2005-11-14  Robert Dewar  <dewar@adacore.com>

* par-ch10.adb (P_Compilation_Unit): Add defenses against junk unit
syntax, which could cause compiler hangs.

From-SVN: r106993

gcc/ada/par-ch10.adb

index 13d0fbd1f004d99472871f84fecbdea7b27a5781..bedb679081aa2e351722bdf226378a47d2bca159 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2005 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2005, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -405,9 +405,7 @@ package body Ch10 is
 
          elsif Private_Sloc /= No_Location
            and then
-             Nkind (Unit (Comp_Unit_Node)) /= N_Function_Instantiation
-           and then
-             Nkind (Unit (Comp_Unit_Node)) /= N_Procedure_Instantiation
+             Nkind (Unit (Comp_Unit_Node)) not in N_Subprogram_Instantiation
            and then
              Nkind (Unit (Comp_Unit_Node)) /= N_Subprogram_Renaming_Declaration
          then
@@ -529,8 +527,25 @@ package body Ch10 is
            or else Nkind (Unit_Node) = N_Single_Protected_Declaration
          then
             Name_Node := Defining_Identifier (Unit_Node);
-         else
+
+         elsif Nkind (Unit_Node) = N_Function_Instantiation
+           or else Nkind (Unit_Node) = N_Function_Specification
+           or else Nkind (Unit_Node) = N_Generic_Function_Renaming_Declaration
+           or else Nkind (Unit_Node) = N_Generic_Package_Renaming_Declaration
+           or else Nkind (Unit_Node) = N_Generic_Procedure_Renaming_Declaration
+           or else Nkind (Unit_Node) = N_Package_Body
+           or else Nkind (Unit_Node) = N_Package_Instantiation
+           or else Nkind (Unit_Node) = N_Package_Renaming_Declaration
+           or else Nkind (Unit_Node) = N_Package_Specification
+           or else Nkind (Unit_Node) = N_Procedure_Instantiation
+           or else Nkind (Unit_Node) = N_Procedure_Specification
+         then
             Name_Node := Defining_Unit_Name (Unit_Node);
+
+         --  Anything else is a serious error, abandon scan
+
+         else
+            raise Error_Resync;
          end if;
 
          Set_Sloc (Comp_Unit_Node, Sloc (Name_Node));