aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Baird <baird@adacore.com>2021-08-05 11:18:19 -0700
committerPierre-Marie de Rodat <derodat@adacore.com>2021-10-01 06:13:35 +0000
commitcafd1c1a71325c0e9dc6a6862fdd5dcd7248fbb6 (patch)
treef0203672827883297d935d8ed3a63ccac61c0711
parent8e35980ff82ad5a00de3237ad94c1fe942fb0ba4 (diff)
downloadgcc-cafd1c1a71325c0e9dc6a6862fdd5dcd7248fbb6.zip
gcc-cafd1c1a71325c0e9dc6a6862fdd5dcd7248fbb6.tar.gz
gcc-cafd1c1a71325c0e9dc6a6862fdd5dcd7248fbb6.tar.bz2
[Ada] Improve error message for .ali file version mismatch
gcc/ada/ * bcheck.adb (Check_Versions): In the case of an ali file version mismatch, if distinct integer values can be extracted from the two version strings then include those values in the generated error message.
-rw-r--r--gcc/ada/bcheck.adb76
1 files changed, 72 insertions, 4 deletions
diff --git a/gcc/ada/bcheck.adb b/gcc/ada/bcheck.adb
index 804e2fd..bf53b4b 100644
--- a/gcc/ada/bcheck.adb
+++ b/gcc/ada/bcheck.adb
@@ -29,6 +29,7 @@ with Binderr; use Binderr;
with Butil; use Butil;
with Casing; use Casing;
with Fname; use Fname;
+with Gnatvsn;
with Namet; use Namet;
with Opt; use Opt;
with Osint;
@@ -1324,11 +1325,78 @@ package body Bcheck is
or else ALIs.Table (A).Ver (1 .. VL) /=
ALIs.Table (ALIs.First).Ver (1 .. VL)
then
- Error_Msg_File_1 := ALIs.Table (A).Sfile;
- Error_Msg_File_2 := ALIs.Table (ALIs.First).Sfile;
+ declare
+ No_Version : constant Int := -1;
- Consistency_Error_Msg
- ("{ and { compiled with different GNAT versions");
+ function Extract_Version (S : String) return Int;
+ -- Attempts to extract and return a nonnegative library
+ -- version number from the given string; if unsuccessful,
+ -- then returns No_Version.
+
+ ---------------------
+ -- Extract_Version --
+ ---------------------
+
+ function Extract_Version (S : String) return Int is
+ use Gnatvsn;
+
+ Prefix : constant String :=
+ Verbose_Library_Version
+ (1 .. Verbose_Library_Version'Length
+ - Library_Version'Length);
+ begin
+ pragma Assert (S'First = 1);
+
+ if S'Length > Prefix'Length
+ and then S (1 .. Prefix'Length) = Prefix
+ then
+ declare
+ Suffix : constant String :=
+ S (1 + Prefix'Length .. S'Last);
+
+ Result : Nat := 0;
+ begin
+ if Suffix'Length < 10
+ and then (for all C of Suffix => C in '0' .. '9')
+ then
+ -- Using Int'Value leads to complications in
+ -- building the binder, so DIY.
+
+ for C of Suffix loop
+ Result := (10 * Result) +
+ (Character'Pos (C) - Character'Pos ('0'));
+ end loop;
+ return Result;
+ end if;
+ end;
+ end if;
+ return No_Version;
+ end Extract_Version;
+
+ V1_Text : constant String :=
+ ALIs.Table (A).Ver (1 .. ALIs.Table (A).Ver_Len);
+ V2_Text : constant String :=
+ ALIs.Table (ALIs.First).Ver (1 .. VL);
+ V1 : constant Int := Extract_Version (V1_Text);
+ V2 : constant Int := Extract_Version (V2_Text);
+
+ Include_Version_Numbers_In_Message : constant Boolean :=
+ (V1 /= V2) and (V1 /= No_Version) and (V2 /= No_Version);
+ begin
+ Error_Msg_File_1 := ALIs.Table (A).Sfile;
+ Error_Msg_File_2 := ALIs.Table (ALIs.First).Sfile;
+
+ if Include_Version_Numbers_In_Message then
+ Error_Msg_Nat_1 := V1;
+ Error_Msg_Nat_2 := V2;
+ Consistency_Error_Msg
+ ("{ and { compiled with different GNAT versions"
+ & ", v# and v#");
+ else
+ Consistency_Error_Msg
+ ("{ and { compiled with different GNAT versions");
+ end if;
+ end;
end if;
end loop;
end Check_Versions;