This implements a new configuration pragma
pragma Prefix_Exception_Messages;
which causes messages set using "raise x with s" to be
prefixed by the expanded name of the enclosing entity if
s is a string literal (if s is more complex, we assume
the program is calculating exactly the message it wants).
So for example, if we have the program:
1. pragma Prefix_Exception_Messages;
2. procedure Prefixem is
3. procedure Inner is
4. begin
5. raise Constraint_Error with "explicit raise";
6. end;
7. begin
8. Inner;
9. end Prefixem;
The output will be:
raised CONSTRAINT_ERROR : Prefixem.Inner: explicit raise
This mode is automatic for run-time library files, so
a typical message from the runtime library which used to
look like:
raised GNAT.CALENDAR.TIME_IO.PICTURE_ERROR :
null picture string
now looks like:
raised GNAT.CALENDAR.TIME_IO.PICTURE_ERROR :
GNAT.Calendar.Time_IO.Image: null picture string
In the case of instantiations of containers, you will get the full
qualified name of the particular instantiation that is involved. For
example, the following program:
1. with Ada.Containers.Ordered_Sets;
2. procedure NoElmt is
3. package Ordered_Integer_Sets is
4. new Ada.Containers.Ordered_Sets (Integer);
5. use Ordered_Integer_Sets;
6. begin
7. if No_Element < No_Element then
8. null;
9. end if;
10. end;
will output
raised CONSTRAINT_ERROR :
NoElmt.Ordered_Integer_Sets."<": Left cursor equals No_Element
This allows disambiguation of messages without reintroducing
line numbers which are problematic for maintaining tests over
different versions and targets.
Tested on x86_64-pc-linux-gnu, committed on trunk
2014-10-10 Robert Dewar <[email protected]>
* exp_ch11.adb (Expand_N_Raise_Statement): Handle
Prefix_Exception_Messages.
* opt.adb: Handle new flags Prefix_Exception_Message[_Config].
* opt.ads: New flags Prefix_Exception_Message[_Config].
* par-prag.adb: New dummy entry for pragma Prefix_Exception_Messages.
* snames.ads-tmpl: Add entries for new pragma Prefix_Exception_Messages.
* sem_prag.adb: Implement new pragma Prefix_Exception_Messages
* gnat_rm.texi: Document pragma Prefix_Exception_Messages.
Index: exp_ch11.adb
===================================================================
--- exp_ch11.adb (revision 216063)
+++ exp_ch11.adb (working copy)
@@ -29,6 +29,7 @@
with Elists; use Elists;
with Errout; use Errout;
with Exp_Ch7; use Exp_Ch7;
+with Exp_Intr; use Exp_Intr;
with Exp_Util; use Exp_Util;
with Namet; use Namet;
with Nlists; use Nlists;
@@ -1565,6 +1566,22 @@
if Present (Expression (N)) then
+ -- Adjust message to deal with Prefix_Exception_Messages. We only
+ -- add the prefix to string literals, if the message is being
+ -- constructed, we assume it already deals with uniqueness.
+
+ if Prefix_Exception_Messages
+ and then Nkind (Expression (N)) = N_String_Literal
+ then
+ Name_Len := 0;
+ Add_Source_Info (Loc, Name_Enclosing_Entity);
+ Add_Str_To_Name_Buffer (": ");
+ Add_String_To_Name_Buffer (Strval (Expression (N)));
+ Rewrite (Expression (N),
+ Make_String_Literal (Loc, Name_Buffer (1 .. Name_Len)));
+ Analyze_And_Resolve (Expression (N), Standard_String);
+ end if;
+
-- Avoid passing exception-name'identity in runtimes in which this
-- argument is not used. This avoids generating undefined references
-- to these exceptions when compiling with no optimization
Index: gnat_rm.texi
===================================================================
--- gnat_rm.texi (revision 216081)
+++ gnat_rm.texi (working copy)
@@ -227,6 +227,7 @@
* Pragma Precondition::
* Pragma Predicate::
* Pragma Preelaborable_Initialization::
+* Pragma Prefix_Exception_Messages::
* Pragma Pre_Class::
* Pragma Priority_Specific_Dispatching::
* Pragma Profile::
@@ -1096,6 +1097,7 @@
* Pragma Precondition::
* Pragma Predicate::
* Pragma Preelaborable_Initialization::
+* Pragma Prefix_Exception_Messages::
* Pragma Pre_Class::
* Pragma Priority_Specific_Dispatching::
* Pragma Profile::
@@ -5692,6 +5694,34 @@
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.
+@node Pragma Prefix_Exception_Messages
+@unnumberedsec Pragma Prefix_Exception_Messages
+@cindex Prefix_Exception_Messages
+@cindex exception
+@cindex Exception_Message
+@findex Exceptions
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Prefix_Exception_Messages;
+@end smallexample
+
+@noindent
+This is an implementation-defined configuration pragma that affects the
+behavior of raise statements with a message given as a static string
+constant (typically a string literal). In such cases, the string will
+be automatically prefixed by the name of the enclosing entity (giving
+the package and subprogram containing the raise statement). This helps
+to identify where messages are coming from, and this mode is automatic
+for the run-time library.
+
+The pragma has no effect if the message is computed with an expression other
+than a static string constant, since the assumption in this case is that
+the program computes exactly the string it wants. If you still want the
+prefixing in this case, you can always call
+@code{GNAT.Source_Info.Enclosing_Entity} and prepend the string manually.
+
@node Pragma Pre_Class
@unnumberedsec Pragma Pre_Class
@cindex Pre_Class
@@ -6199,7 +6229,7 @@
@smallexample @c ada
pragma Restriction_Warnings (No_Implementation_Pragmas);
-pragma Warnings (Off, "violation of*No_Implementation_Pragmas*");
+7 (Off, "violation of*No_Implementation_Pragmas*");
pragma Ada_95;
pragma Style_Checks ("2bfhkM160");
pragma Warnings (On, "violation of*No_Implementation_Pragmas*");
@@ -7825,7 +7855,9 @@
the scope of @code{Suppress}). This form cannot be used as a configuration
pragma.
-The form with a single static_string_EXPRESSION argument (and possible
+In the case where the first argument is other than @code{ON} or
+@code{OFF},
+the third form with a single static_string_EXPRESSION argument (and possible
reason) provides more precise
control over which warnings are active. The string is a list of letters
specifying which warnings are to be activated and which deactivated. The
Index: opt.adb
===================================================================
--- opt.adb (revision 216063)
+++ opt.adb (working copy)
@@ -63,6 +63,7 @@
Optimize_Alignment_Config := Optimize_Alignment;
Persistent_BSS_Mode_Config := Persistent_BSS_Mode;
Polling_Required_Config := Polling_Required;
+ Prefix_Exception_Messages_Config := Prefix_Exception_Messages;
SPARK_Mode_Config := SPARK_Mode;
SPARK_Mode_Pragma_Config := SPARK_Mode_Pragma;
Uneval_Old_Config := Uneval_Old;
@@ -102,6 +103,7 @@
Optimize_Alignment_Local := Save.Optimize_Alignment_Local;
Persistent_BSS_Mode := Save.Persistent_BSS_Mode;
Polling_Required := Save.Polling_Required;
+ Prefix_Exception_Messages := Save.Prefix_Exception_Messages;
SPARK_Mode := Save.SPARK_Mode;
SPARK_Mode_Pragma := Save.SPARK_Mode_Pragma;
Uneval_Old := Save.Uneval_Old;
@@ -142,6 +144,7 @@
Save.Optimize_Alignment_Local := Optimize_Alignment_Local;
Save.Persistent_BSS_Mode := Persistent_BSS_Mode;
Save.Polling_Required := Polling_Required;
+ Save.Prefix_Exception_Messages := Prefix_Exception_Messages;
Save.SPARK_Mode := SPARK_Mode;
Save.SPARK_Mode_Pragma := SPARK_Mode_Pragma;
Save.Uneval_Old := Uneval_Old;
@@ -174,6 +177,7 @@
External_Name_Imp_Casing := Lowercase;
Optimize_Alignment := 'O';
Persistent_BSS_Mode := False;
+ Prefix_Exception_Messages := True;
Uneval_Old := 'E';
Use_VADS_Size := False;
Optimize_Alignment_Local := True;
@@ -221,6 +225,7 @@
Optimize_Alignment := Optimize_Alignment_Config;
Optimize_Alignment_Local := False;
Persistent_BSS_Mode := Persistent_BSS_Mode_Config;
+ Prefix_Exception_Messages := Prefix_Exception_Messages_Config;
SPARK_Mode := SPARK_Mode_Config;
SPARK_Mode_Pragma := SPARK_Mode_Pragma_Config;
Uneval_Old := Uneval_Old_Config;
@@ -236,6 +241,8 @@
Init_Or_Norm_Scalars := Initialize_Scalars or Normalize_Scalars;
end if;
+ -- Values set for all units
+
Default_Pool := Default_Pool_Config;
Exception_Locations_Suppressed := Exception_Locations_Suppressed_Config;
Fast_Math := Fast_Math_Config;
Index: opt.ads
===================================================================
--- opt.ads (revision 216063)
+++ opt.ads (working copy)
@@ -1188,6 +1188,10 @@
-- Set to True if polling for asynchronous abort is enabled by using
-- the -gnatP option for GNAT.
+ Prefix_Exception_Messages : Boolean := False;
+ -- GNAT
+ -- Set True to prefix exception messages with entity-name:
+
Preprocessing_Data_File : String_Ptr := null;
-- GNAT
-- Set by switch -gnatep=. The file name of the preprocessing data file.
@@ -1950,6 +1954,9 @@
-- flag is used to set the initial value for Polling_Required at the start
-- of analyzing each unit.
+ Prefix_Exception_Messages_Config : Boolean;
+ -- The setting of Prefix_Exception_Messages from configuration pragmas
+
SPARK_Mode_Config : SPARK_Mode_Type := None;
-- GNAT
-- The setting of SPARK_Mode from configuration pragmas
@@ -2197,6 +2204,7 @@
Optimize_Alignment_Local : Boolean;
Persistent_BSS_Mode : Boolean;
Polling_Required : Boolean;
+ Prefix_Exception_Messages : Boolean;
SPARK_Mode : SPARK_Mode_Type;
SPARK_Mode_Pragma : Node_Id;
Uneval_Old : Character;
Index: par-prag.adb
===================================================================
--- par-prag.adb (revision 216063)
+++ par-prag.adb (working copy)
@@ -1275,6 +1275,7 @@
Pragma_Passive |
Pragma_Preelaborable_Initialization |
Pragma_Polling |
+ Pragma_Prefix_Exception_Messages |
Pragma_Persistent_BSS |
Pragma_Post |
Pragma_Postcondition |
Index: sem_prag.adb
===================================================================
--- sem_prag.adb (revision 216084)
+++ sem_prag.adb (working copy)
@@ -17753,6 +17753,18 @@
end if;
end Preelaborate;
+ -------------------------------
+ -- Prefix_Exception_Messages --
+ -------------------------------
+
+ -- pragma Prefix_Exception_Messages;
+
+ when Pragma_Prefix_Exception_Messages =>
+ GNAT_Pragma;
+ Check_Valid_Configuration_Pragma;
+ Check_Arg_Count (0);
+ Prefix_Exception_Messages := True;
+
--------------
-- Priority --
--------------
@@ -24739,7 +24751,7 @@
-- whether appearance of some name in a given pragma is to be considered
-- as a reference for the purposes of warnings about unreferenced objects.
- -- -1 indicates that references in any argument position are significant
+ -- -1 indicates that appearence in any argument is significant
-- 0 indicates that appearance in any argument is not significant
-- +n indicates that appearance as argument n is significant, but all
-- other arguments are not significant
@@ -24881,14 +24893,15 @@
Pragma_Optimize_Alignment => -1,
Pragma_Overflow_Mode => 0,
Pragma_Overriding_Renamings => 0,
- Pragma_Ordered => 0,
+ Pragma_Ordered => -1,
Pragma_Pack => 0,
Pragma_Page => -1,
Pragma_Part_Of => -1,
Pragma_Partition_Elaboration_Policy => -1,
Pragma_Passive => -1,
Pragma_Persistent_BSS => 0,
- Pragma_Polling => -1,
+ Pragma_Polling => 0,
+ Pragma_Prefix_Exception_Messages => 0,
Pragma_Post => -1,
Pragma_Postcondition => -1,
Pragma_Post_Class => -1,
Index: snames.ads-tmpl
===================================================================
--- snames.ads-tmpl (revision 216063)
+++ snames.ads-tmpl (working copy)
@@ -415,6 +415,7 @@
Name_Partition_Elaboration_Policy : constant Name_Id := N + $; -- Ada 05
Name_Persistent_BSS : constant Name_Id := N + $; -- GNAT
Name_Polling : constant Name_Id := N + $; -- GNAT
+ Name_Prefix_Exception_Messages : constant Name_Id := N + $; -- GNAT
Name_Priority_Specific_Dispatching : constant Name_Id := N + $; -- Ada 05
Name_Profile : constant Name_Id := N + $; -- Ada 05
Name_Profile_Warnings : constant Name_Id := N + $; -- GNAT
@@ -1755,6 +1756,7 @@
Pragma_Partition_Elaboration_Policy,
Pragma_Persistent_BSS,
Pragma_Polling,
+ Pragma_Prefix_Exception_Messages,
Pragma_Priority_Specific_Dispatching,
Pragma_Profile,
Pragma_Profile_Warnings,