[Ada] Suppress Initialize_Scalars for Persistent_BSS
authorBob Duff <duff@adacore.com>
Tue, 20 Aug 2019 09:49:51 +0000 (09:49 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 20 Aug 2019 09:49:51 +0000 (09:49 +0000)
If a variable has pragma Persistent_BSS, the compiler now automatically
suppresses implicit initializations caused by Initialize_Scalars and
Normalize_Scalars. Variables with Persistent_BSS cannot be initialized,
and previously a pragma Suppress_Initialization was required before the
pragma Persistent_BSS.

2019-08-20  Bob Duff  <duff@adacore.com>

gcc/ada/

* sem_prag.adb (Persistent_BSS): If an initialization is present
because of Initialize_Scalars or Normalize_Scalars, generate an
implicit pragma Suppress_Initialization to remove that, because
initialization is not allowed for these variables. Other
initializations remain illegal.

From-SVN: r274732

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

index ecda7b8695a86a08945d2a6d760b3f938dd6c08a..3cb30ef644808d2d98268874fcaa6e888c9c729a 100644 (file)
@@ -1,3 +1,11 @@
+2019-08-20  Bob Duff  <duff@adacore.com>
+
+       * sem_prag.adb (Persistent_BSS): If an initialization is present
+       because of Initialize_Scalars or Normalize_Scalars, generate an
+       implicit pragma Suppress_Initialization to remove that, because
+       initialization is not allowed for these variables. Other
+       initializations remain illegal.
+
 2019-08-20  Gary Dismukes  <dismukes@adacore.com>
 
        * sem_ch3.adb (OK_For_Limited_Init_In_05): In the case of type
index 05bc6f582a5e8396cf3dada74eaa3a0f90c3e618..4a774515e7bd10aa7d16bc1858cf8f4757254b2e 100644 (file)
@@ -21092,8 +21092,24 @@ package body Sem_Prag is
                Decl := Parent (Ent);
 
                if Present (Expression (Decl)) then
-                  Error_Pragma_Arg
-                    ("object for pragma% cannot have initialization", Arg1);
+                  --  Variables in Persistent_BSS cannot be initialized, so
+                  --  turn off any initialization that might be caused by
+                  --  pragmas Initialize_Scalars or Normalize_Scalars.
+
+                  if Kill_Range_Check (Expression (Decl)) then
+                     Prag :=
+                       Make_Pragma (Loc,
+                         Name_Suppress_Initialization,
+                         Pragma_Argument_Associations => New_List (
+                           Make_Pragma_Argument_Association (Loc,
+                             Expression => New_Occurrence_Of (Ent, Loc))));
+                     Insert_Before (N, Prag);
+                     Analyze (Prag);
+
+                  else
+                     Error_Pragma_Arg
+                       ("object for pragma% cannot have initialization", Arg1);
+                  end if;
                end if;
 
                if not Is_Potentially_Persistent_Type (Etype (Ent)) then
@@ -21104,7 +21120,7 @@ package body Sem_Prag is
 
                Prag :=
                  Make_Linker_Section_Pragma
-                   (Ent, Sloc (N), ".persistent.bss");
+                   (Ent, Loc, ".persistent.bss");
                Insert_After (N, Prag);
                Analyze (Prag);