sem_ch8.adb (Push_Scope): Add a check for when the scope table is empty to assign...
authorJustin Squirek <squirek@adacore.com>
Wed, 22 Jun 2016 10:42:46 +0000 (10:42 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 22 Jun 2016 10:42:46 +0000 (12:42 +0200)
2016-06-22  Justin Squirek  <squirek@adacore.com>

* sem_ch8.adb (Push_Scope): Add a check for when the
scope table is empty to assign the global variable
Configuration_Component_Alignment.
* sem.adb (Do_Analyze): Add Configuration_Component_Alignment
to be assigned when the environment is cleaned instead of the
default.
* sem.ads Add a global variable Configuration_Component_Alignment
to store the value given by pragma Component_Alignment in the
context of a configuration file.
* sem_prag.adb (Analyze_Pragma): Correct the case for
Component_Alignment so that the pragma is verified and add
comments to explain how it is applied to the scope stack.

2016-06-22  Justin Squirek  <squirek@adacore.com>

* sprint.adb (Sprint_Node_Actual): Add check in
the case of an N_Object_Declaration when evaluating an expression
to properly ignore errors.

From-SVN: r237694

gcc/ada/ChangeLog
gcc/ada/sem.adb
gcc/ada/sem.ads
gcc/ada/sem_ch8.adb
gcc/ada/sem_prag.adb
gcc/ada/sprint.adb

index b4e4cf5356f9937d9577315a8103ae94147f25fe..82d33d026bb7b150716a3b2ce010a38cc8f47315 100644 (file)
@@ -1,3 +1,24 @@
+2016-06-22  Justin Squirek  <squirek@adacore.com>
+
+       * sem_ch8.adb (Push_Scope): Add a check for when the
+       scope table is empty to assign the global variable
+       Configuration_Component_Alignment.
+       * sem.adb (Do_Analyze): Add Configuration_Component_Alignment
+       to be assigned when the environment is cleaned instead of the
+       default.
+       * sem.ads Add a global variable Configuration_Component_Alignment
+       to store the value given by pragma Component_Alignment in the
+       context of a configuration file.
+       * sem_prag.adb (Analyze_Pragma): Correct the case for
+       Component_Alignment so that the pragma is verified and add
+       comments to explain how it is applied to the scope stack.
+
+2016-06-22  Justin Squirek  <squirek@adacore.com>
+
+       * sprint.adb (Sprint_Node_Actual): Add check in
+       the case of an N_Object_Declaration when evaluating an expression
+       to properly ignore errors.
+
 2016-06-22  Bob Duff  <duff@adacore.com>
 
        * g-comlin.ads (Parameter_Type): Change subtype of Last to
index 3cd073082a9023fb27eb049d79fc2b38ac15d9d5..ea5f4741727d4d82d1ba1723a3dc96259682dbc0 100644 (file)
@@ -1355,7 +1355,8 @@ package body Sem is
          Outer_Generic_Scope := Empty;
          Scope_Suppress      := Suppress_Options;
          Scope_Stack.Table
-           (Scope_Stack.Last).Component_Alignment_Default := Calign_Default;
+           (Scope_Stack.Last).Component_Alignment_Default :=
+             Configuration_Component_Alignment;
          Scope_Stack.Table
            (Scope_Stack.Last).Is_Active_Stack_Base := True;
 
index c52f6b492e7c719fd892d7a472967c7f28900bb2..f9c2dadabf3fefb1489aca96a1a9ae34125d3883 100644 (file)
@@ -461,6 +461,11 @@ package Sem is
    --  Transient blocks have three associated actions list, to be inserted
    --  before and after the block's statements, and as cleanup actions.
 
+   Configuration_Component_Alignment : Component_Alignment_Kind :=
+                                         Calign_Default;
+   --  Used for handling the pragma Component_Alignment in the context of a
+   --  configuration file.
+
    type Scope_Stack_Entry is record
       Entity : Entity_Id;
       --  Entity representing the scope
index e1b31aaa34abbbd4b7a9a4872cae3d37d968ef14..0c5860b81d94682f22822b79df6932d34bb859c1 100644 (file)
@@ -8192,10 +8192,22 @@ package body Sem_Ch8 is
          SST.Save_Default_SSO              := Default_SSO;
          SST.Save_Uneval_Old               := Uneval_Old;
 
+         --  Each new scope pushed onto the scope stack inherits the component
+         --  alignment of the previous scope. This emulates the "visibility"
+         --  semantics of pragma Component_Alignment.
+
          if Scope_Stack.Last > Scope_Stack.First then
             SST.Component_Alignment_Default := Scope_Stack.Table
                                                  (Scope_Stack.Last - 1).
                                                    Component_Alignment_Default;
+
+         --  Otherwise, this is the first scope being pushed on the scope
+         --  stack. Inherit the component alignment from the configuration
+         --  form of pragma Component_Alignment (if any).
+
+         else
+            SST.Component_Alignment_Default :=
+              Configuration_Component_Alignment;
          end if;
 
          SST.Last_Subprogram_Name           := null;
index ccaa8e90f6e9193cba8a83f5e43273f87f79033d..d17dee2aefa0d43f4077fd0c116f3e36a886a5e9 100644 (file)
@@ -12787,9 +12787,21 @@ package body Sem_Prag is
                  ("invalid Form parameter for pragma%", Form);
             end if;
 
+            --  The pragma appears in a configuration file
+
+            if No (Parent (N)) then
+               Check_Valid_Configuration_Pragma;
+
+               --  Capture the component alignment in a global variable when
+               --  the pragma appears in a configuration file. Note that the
+               --  scope stack is empty at this point and cannot be used to
+               --  store the alignment value.
+
+               Configuration_Component_Alignment := Atype;
+
             --  Case with no name, supplied, affects scope table entry
 
-            if No (Name) then
+            elsif No (Name) then
                Scope_Stack.Table
                  (Scope_Stack.Last).Component_Alignment_Default := Atype;
 
@@ -20901,7 +20913,7 @@ package body Sem_Prag is
             Mode_Id := Get_SPARK_Mode_Type (Mode);
             Context := Parent (N);
 
-            --  The pragma appears in a configuration pragmas file
+            --  The pragma appears in a configuration file
 
             if No (Context) then
                Check_Valid_Configuration_Pragma;
index b1def4b722ada3607eb5d57ddcc253a2cec8ec95..0185719b795991c64e641f9a59db2825a13e535e 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -2385,7 +2385,9 @@ package body Sprint is
                      end if;
                   end;
 
-                  if Present (Expression (Node)) then
+                  if Present (Expression (Node))
+                    and then Expression (Node) /= Error
+                  then
                      Write_Str (" := ");
                      Sprint_Node (Expression (Node));
                   end if;