diff mbox

[Ada] Detect more cases of Long_Float inconsistencies at compile time

Message ID 20111104105617.GA25576@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet Nov. 4, 2011, 10:56 a.m. UTC
This patch causes more cases of inconsistent use of pragma Long_Float to
be caught at compile time. This gives better messages earlier, and also
avoids some blowups due to inconsistent usage.

The following is pkg1.adb compiled with -gnatdm -gnatld7 -gnatj60

Compiling: pkg1.adb

     1. package body Pkg1 is
     2.    procedure Sep is separate;
     3. end Pkg1;

Compiling: pkg1.ads

     1. package Pkg1 is
     2.    F1 : Float := 12.5;
     3.
     4.    procedure Sep;
     5. end Pkg1;

Compiling: pkg1-sep.adb

     1. with Ada.Text_IO; use Ada.Text_IO;
     2. with T1;
     3.
     4. separate (Pkg1)
     5. procedure Sep is
     6. begin
     7.    Put_Line (Float'Image (T1.F2));
     8. end Sep;
     9.

==============Error messages for source file: t1.ads
     1. pragma Long_Float(G_Float);
                          |
        >>> main unit not compiled with pragma Long_Float
            (G_Float), pragma "Long_Float" must be used
            consistently for whole partition

The source file t1.ads is:

     1. pragma Long_Float(G_Float);
     2.
     3. package T1 is
     4.    subtype F is Float;
     5.
     6.    F2 : F := 4.5;
     7. end T1;

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-11-04  Robert Dewar  <dewar@adacore.com>

	* sem_prag.adb: Detect more cases of Long_Float inconsistencies at
	compile time.
diff mbox

Patch

Index: sem_prag.adb
===================================================================
--- sem_prag.adb	(revision 180929)
+++ sem_prag.adb	(working copy)
@@ -10952,7 +10952,8 @@ 
 
          --  pragma Long_Float (D_Float | G_Float);
 
-         when Pragma_Long_Float =>
+         when Pragma_Long_Float => Long_Float : declare
+         begin
             GNAT_Pragma;
             Check_Valid_Configuration_Pragma;
             Check_Arg_Count (1);
@@ -10967,22 +10968,42 @@ 
 
             if Chars (Get_Pragma_Arg (Arg1)) = Name_D_Float then
                if Opt.Float_Format_Long = 'G' then
-                  Error_Pragma ("G_Float previously specified");
+                  Error_Pragma_Arg
+                    ("G_Float previously specified", Arg1);
+
+               elsif Current_Sem_Unit /= Main_Unit
+                 and then Opt.Float_Format_Long /= 'D'
+               then
+                  Error_Pragma_Arg
+                    ("main unit not compiled with pragma Long_Float (D_Float)",
+                     "\pragma% must be used consistently for whole partition",
+                     Arg1);
+
+               else
+                  Opt.Float_Format_Long := 'D';
                end if;
 
-               Opt.Float_Format_Long := 'D';
-
             --  G_Float case (this is the default, does not need overriding)
 
             else
                if Opt.Float_Format_Long = 'D' then
                   Error_Pragma ("D_Float previously specified");
+
+               elsif Current_Sem_Unit /= Main_Unit
+                 and then Opt.Float_Format_Long /= 'G'
+               then
+                  Error_Pragma_Arg
+                    ("main unit not compiled with pragma Long_Float (G_Float)",
+                     "\pragma% must be used consistently for whole partition",
+                     Arg1);
+
+               else
+                  Opt.Float_Format_Long := 'G';
                end if;
-
-               Opt.Float_Format_Long := 'G';
             end if;
 
             Set_Standard_Fpt_Formats;
+         end Long_Float;
 
          -----------------------
          -- Machine_Attribute --