decl.c (gnat_to_gnu_entity): Do not specifically deal with external constants wrt...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 11 Jun 2012 08:34:44 +0000 (08:34 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 11 Jun 2012 08:34:44 +0000 (08:34 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity): Do not specifically deal
with external constants wrt force_global here...
<E_Constant>: ...but here instead.
* gcc-interface/utils.c (gnat_pushdecl): Do not put external DECLs onto
the list of global DECLs.

From-SVN: r188379

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/ada/gcc-interface/utils.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/constant4.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/constant4_pkg.ads [new file with mode: 0644]

index dcd94738647e2a5400055708aa7efba661d5bfe1..031d6616c0646e6bd689e62c8dc97990cfcda596 100644 (file)
@@ -1,3 +1,11 @@
+2012-06-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity): Do not specifically deal
+       with external constants wrt force_global here...
+       <E_Constant>: ...but here instead.
+       * gcc-interface/utils.c (gnat_pushdecl): Do not put external DECLs onto
+       the list of global DECLs.
+
 2012-06-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity): Translate the Esize on
index 1c7f337b38f9c2cf424d4f1dd82338f6f08958e1..ce2f94a253865a8fd28619af4c3976eeb8fc5f70 100644 (file)
@@ -348,12 +348,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
      another compilation unit) public entities, show we are at global level
      for the purpose of computing scopes.  Don't do this for components or
      discriminants since the relevant test is whether or not the record is
-     being defined.  Don't do this for constants either as we'll look into
-     their defining expression in the local context.  */
+     being defined.  */
   if (!definition
       && kind != E_Component
       && kind != E_Discriminant
-      && kind != E_Constant
       && Is_Public (gnat_entity)
       && !Is_Statically_Allocated (gnat_entity))
     force_global++, this_global = true;
@@ -424,6 +422,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
             != N_Allocator)
        {
          bool went_into_elab_proc = false;
+         int save_force_global = force_global;
 
          /* The expression may contain N_Expression_With_Actions nodes and
             thus object declarations from other units.  In this case, even
@@ -436,11 +435,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
              current_function_decl = get_elaboration_procedure ();
              went_into_elab_proc = true;
            }
+         force_global = 0;
          gnat_pushlevel ();
 
          gnu_expr = gnat_to_gnu (Expression (Declaration_Node (gnat_entity)));
 
          gnat_zaplevel ();
+         force_global = save_force_global;
          if (went_into_elab_proc)
            current_function_decl = NULL_TREE;
        }
index 5800308470066435bb6ea8af4250087886792eb9..db909d93377538c8a89edd5e6cc17b225064fdae 100644 (file)
@@ -572,14 +572,14 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
   if (!(TREE_CODE (decl) == TYPE_DECL
         && TREE_CODE (TREE_TYPE (decl)) == UNCONSTRAINED_ARRAY_TYPE))
     {
-      if (global_bindings_p ())
+      if (DECL_EXTERNAL (decl))
        {
-         VEC_safe_push (tree, gc, global_decls, decl);
-
          if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
            VEC_safe_push (tree, gc, builtin_decls, decl);
        }
-      else if (!DECL_EXTERNAL (decl))
+      else if (global_bindings_p ())
+       VEC_safe_push (tree, gc, global_decls, decl);
+      else
        {
          DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
          BLOCK_VARS (current_binding_level->block) = decl;
index 60c8e28a6d92f8f6d7897061d8cb89253b8205b6..b8c9c7b949b811d91bac1c0b8cc9d24cf0fa2223 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/constant4.adb: New test.
+       * gnat.dg/constant4_pkg.ads: New helper.
+
 2012-06-08  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/52552
diff --git a/gcc/testsuite/gnat.dg/constant4.adb b/gcc/testsuite/gnat.dg/constant4.adb
new file mode 100644 (file)
index 0000000..826823a
--- /dev/null
@@ -0,0 +1,12 @@
+-- { dg-do link }
+-- { dg-options "-gnat12" }
+
+with Constant4_Pkg; use Constant4_Pkg;
+
+procedure Constant4 is
+   Sum : Counter := 0;
+begin
+   for Count of Steals loop
+      Sum := Sum + Count;
+   end loop;
+end;
diff --git a/gcc/testsuite/gnat.dg/constant4_pkg.ads b/gcc/testsuite/gnat.dg/constant4_pkg.ads
new file mode 100644 (file)
index 0000000..f0c6f8f
--- /dev/null
@@ -0,0 +1,15 @@
+with Ada.Command_Line;       use Ada.Command_Line;
+with System.Multiprocessors; use System.Multiprocessors;
+
+package Constant4_Pkg is
+
+   Max_CPUs : constant CPU := (if Argument_Count < 2 then Number_Of_CPUs
+                               else CPU'Value (Argument (2)));
+
+   subtype Worker_Id is CPU range 1 .. Max_CPUs;
+
+   type Counter is range 0 .. 10**18;
+
+   Steals : array (Worker_Id) of Counter := (others => 0);
+
+end Constant4_Pkg;