This patch protects the compiler against cascaded errors and infinite loops
when analyzing a subunit that has serious syntax errors and an incomplete
context.
Compiling configurations.adb must yield:
configurations.adb:1:01: spec of this package does not allow a body
configurations-kernel-system_model.adb:7:05: misplaced "return" statement
configurations-kernel-system_model.adb:8:02:
missing "begin" for function "Exists" at line 5
---
with text_IO;
separate (Configurations.Kernel)
package body System_Model is
-- syntactic errors below ....
function Exists (NickNum: Integer) return Boolean is
-- begin
return False;
end Exists;
end System_Model;
--
separate(Configurations)
package body Kernel is
package System_Model is
end System_Model;
package body System_Model is separate;
end Kernel;
--
package body Configurations is
-- actually proper body not allowed ...
package body Kernel is separate;
begin
null;
end Configurations;
--
generic
package Configurations is
package Kernel is
end Kernel;
end Configurations;
--
Tested on x86_64-pc-linux-gnu, committed on trunk
2011-09-05 Ed Schonberg <[email protected]>
* sem_ch10.adb (Analyze_Context): Apply simple fixup if context
of subunit is incomplete.
(Analyze_Proper_Body): If parent spec is not available, do not
attempt analysis.
Index: sem_ch10.adb
===================================================================
--- sem_ch10.adb (revision 178534)
+++ sem_ch10.adb (working copy)
@@ -1650,6 +1650,16 @@
if Present (Library_Unit (N)) then
Set_Corresponding_Stub (Unit (Library_Unit (N)), N);
+
+ -- If the subunit has severe errors, the spec of the enclosing
+ -- body may not be available, in which case do not try analysis.
+
+ if Serious_Errors_Detected > 0
+ and then No (Library_Unit (Library_Unit (N)))
+ then
+ return;
+ end if;
+
Analyze_Subunit (Library_Unit (N));
-- Otherwise we must load the subunit and link to it
@@ -1990,6 +2000,16 @@
null;
else
+ -- If a subunits has serious syntax errors, the context
+ -- may not have been loaded. Add a harmless unit name to
+ -- attempt processing.
+
+ if Serious_Errors_Detected > 0
+ and then No (Entity (Name (Item)))
+ then
+ Set_Entity (Name (Item), Standard_Standard);
+ end if;
+
Unit_Name := Entity (Name (Item));
while Is_Child_Unit (Unit_Name) loop
Set_Is_Visible_Child_Unit (Unit_Name);