[Ada] Crash on pragma Compile_Time_Warning with declared string constant
authorEd Schonberg <schonberg@adacore.com>
Tue, 22 May 2018 13:22:06 +0000 (13:22 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 22 May 2018 13:22:06 +0000 (13:22 +0000)
This patch fixes a compiler abort on a pragma Compile_Time_Warning when its
second argument is a reference to a constsant string (rather than a string
literal or an expression that evaluates to a string literal).

Compiling msain.adb must yield:

   main.adb:5:33: warning: Good
   main.adb:6:33: warning: VALLUE
   main.adb:7:33: warning: Test

----
procedure Main is
   Value : constant String := "Test";
   Switch : constant Boolean := True;
begin
   pragma Compile_Time_Warning (Switch, "Good");
   pragma Compile_Time_Warning (Switch, "VAL" & "LUE");
   pragma Compile_Time_Warning (Switch, value);
   null;
end Main;

2018-05-22  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Handle properly
a second argument that is a constant of a given string value.

From-SVN: r260514

gcc/ada/ChangeLog
gcc/ada/sem_prag.adb

index 707ca720d6a2c2fc6bd1da495db4b59e74b000a5..c67e473f1f9c2e37b545268241f6e109e983e068 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Handle properly
+       a second argument that is a constant of a given string value.
+
 2018-05-22  Doug Rupp  <rupp@adacore.com>
 
        * sigtramp-vxworks-target.inc: Align stack to 128bits on AArch64.
index ed7441ae7f4e1a0112e8ec0e91c8a549da41f2dc..8dae23dc5d6e3fbc1b47c994b248c6bc9f71b98f 100644 (file)
@@ -30359,11 +30359,18 @@ package body Sem_Prag is
 
       if Compile_Time_Known_Value (Arg1x) then
          if Is_True (Expr_Value (Arg1x)) then
+
+            --  We have already verified that the second argument is a static
+            --  string expression. Its string value must be retrieved
+            --  explicitly if it is a declared constant, otherwise it has
+            --  been constant-folded previously.
+
             declare
                Cent    : constant Entity_Id := Cunit_Entity (Current_Sem_Unit);
                Pname   : constant Name_Id   := Pragma_Name_Unmapped (N);
                Prag_Id : constant Pragma_Id := Get_Pragma_Id (Pname);
-               Str     : constant String_Id := Strval (Get_Pragma_Arg (Arg2));
+               Str     : constant String_Id :=
+                           Strval (Expr_Value_S (Get_Pragma_Arg (Arg2)));
                Str_Len : constant Nat       := String_Length (Str);
 
                Force : constant Boolean :=