From: Viljar Indus <[email protected]>

Typically nodes from Standard were not printed without the
fully qualified prefix names even when Error_Msg_Qual_Level was set.
However in some cases it makes sense to emphasize that the variable
is coming from Standard.

Add a new variable called Error_Msg_Qual_For_Standard to enable
qualified names for entities coming from Standard.

gcc/ada/ChangeLog:

        * err_vars.ads (Error_Msg_Qual_For_Standard): New Variable.
        * errout.ads (Error_Msg_Qual_For_Standard): Likewise.
        * errout.adb (Set_Qualification): Print all qualified names
        when Error_Msg_Qual_For_Standard is set.
        * sem_util.adb (Normalize_Actuals): Improve error message.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/err_vars.ads | 7 +++++++
 gcc/ada/errout.adb   | 5 ++++-
 gcc/ada/errout.ads   | 3 +++
 gcc/ada/sem_util.adb | 8 +++++---
 4 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/gcc/ada/err_vars.ads b/gcc/ada/err_vars.ads
index 45ff26a4d56..179c65a84cf 100644
--- a/gcc/ada/err_vars.ads
+++ b/gcc/ada/err_vars.ads
@@ -55,6 +55,13 @@ package Err_Vars is
    --  not get reset by any Error_Msg call, so the caller is responsible
    --  for resetting it.
 
+   Error_Msg_Qual_For_Standard : Boolean := False;
+   --  Typically we do not want to specify the Standard package when presenting
+   --  entity names even when Error_Msg_Qual_Level is not zero. However
+   --  sometimes we want to emphasize the fact that it is the entity from
+   --  standard. Note that this value does not get reset by any Error_Msg call,
+   --  so the caller is responsible for resetting it.
+
    Current_Error_Source_File : Source_File_Index := No_Source_File;
    --  Id of current messages. Used to post file name when unit changes. This
    --  is initialized to Main_Source_File at the start of a compilation, which
diff --git a/gcc/ada/errout.adb b/gcc/ada/errout.adb
index ab5aaf0b737..2c427b7515e 100644
--- a/gcc/ada/errout.adb
+++ b/gcc/ada/errout.adb
@@ -4129,7 +4129,10 @@ package body Errout is
 
    procedure Set_Qualification (N : Nat; E : Entity_Id) is
    begin
-      if N /= 0 and then Scope (E) /= Standard_Standard then
+      if N /= 0
+        and then
+          (Scope (E) /= Standard_Standard or else Error_Msg_Qual_For_Standard)
+      then
          Set_Qualification (N - 1, Scope (E));
          Set_Msg_Node (Scope (E));
          Set_Msg_Char ('.');
diff --git a/gcc/ada/errout.ads b/gcc/ada/errout.ads
index be828d55c69..a9756f6b089 100644
--- a/gcc/ada/errout.ads
+++ b/gcc/ada/errout.ads
@@ -483,6 +483,9 @@ package Errout is
    --  not get reset by any Error_Msg call, so the caller is responsible
    --  for resetting it.
 
+   Error_Msg_Qual_For_Standard : Boolean renames
+     Err_Vars.Error_Msg_Qual_For_Standard;
+
    Error_Msg_Warn : Boolean renames Err_Vars.Error_Msg_Warn;
    --  Used if current message contains a < insertion character to indicate
    --  if the current message is a warning message. Must be set appropriately
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 1745accfe59..5698b2f0fef 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -25986,10 +25986,12 @@ package body Sem_Util is
                   if Present (Homonym (S))
                     and then Sloc (Homonym (S)) = Standard_Location
                   then
+                     Error_Msg_Qual_For_Standard := True;
+                     Error_Msg_Qual_Level := 1;
                      Error_Msg_NE
-                       ("\\did you mean & in Standard'?",
-                        Name (N),
-                        Homonym (S));
+                       ("\\did you mean &'?", Name (N), Homonym (S));
+                     Error_Msg_Qual_For_Standard := False;
+                     Error_Msg_Qual_Level := 0;
                   end if;
                else
                   Error_Msg_N ("too many arguments in call to&", Name (N));
-- 
2.53.0

Reply via email to