Some configuration pragmas require the presence of a compilation unit context to be processed. Their analysis is deferred until after the main unit has been analyzed. However, if that analysis fails for any reason, then the context may not be correctly established, and the deferred config pragmas must not be analyzed, because this could cause a compiler crash.
Using a compiler with assertions enabled, the following compilation must produce the indicated error message (and no bug box): $ gcc -c illeg.adb illeg.adb:2:04: declaration expected package Illeg is procedure Proc; end Illeg; package body Illeg is illegal; end Illeg; -- gnat.adc: pragma Initialize_Scalars; pragma Restrictions (No_Abort_Statements); pragma Restrictions (Max_Asynchronous_Select_Nesting => 0); pragma Restrictions (No_Asynchronous_Control); pragma Restrictions (No_Dynamic_Priorities); pragma Interrupt_State (Name => SIGABRT, State => SYSTEM); pragma Interrupt_State (Name => SIGTERM, State => SYSTEM); pragma Interrupt_State (Name => SIGPIPE, State => SYSTEM); Tested on x86_64-pc-linux-gnu, committed on trunk 2012-08-06 Thomas Quinot <qui...@adacore.com> * frontend.adb: Do not attempt to process deferred configuration pragmas if the main unit failed to load, to avoid cascaded inconsistencies that can lead to a compiler crash.
Index: frontend.adb =================================================================== --- frontend.adb (revision 190155) +++ frontend.adb (working copy) @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2012, 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- -- @@ -282,6 +282,7 @@ -- a context for their semantic processing. if Config_Pragmas /= Error_List + and then not Fatal_Error (Main_Unit) and then Operating_Mode /= Check_Syntax then -- Pragmas that require some semantic activity, such as