From 9083aacd090fc35f85659bdaa812384779ef73e2 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 11 Jun 2012 08:34:44 +0000 Subject: [PATCH] decl.c (gnat_to_gnu_entity): Do not specifically deal with external constants wrt force_global here... * gcc-interface/decl.c (gnat_to_gnu_entity): Do not specifically deal with external constants wrt force_global here... : ...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 | 8 ++++++++ gcc/ada/gcc-interface/decl.c | 7 ++++--- gcc/ada/gcc-interface/utils.c | 8 ++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gnat.dg/constant4.adb | 12 ++++++++++++ gcc/testsuite/gnat.dg/constant4_pkg.ads | 15 +++++++++++++++ 6 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/constant4.adb create mode 100644 gcc/testsuite/gnat.dg/constant4_pkg.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index dcd94738647..031d6616c06 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2012-06-11 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_entity): Do not specifically deal + with external constants wrt force_global here... + : ...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 * gcc-interface/decl.c (gnat_to_gnu_entity): Translate the Esize on diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 1c7f337b38f..ce2f94a2538 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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; } diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 58003084700..db909d93377 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 60c8e28a6d9..b8c9c7b949b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-06-11 Eric Botcazou + + * gnat.dg/constant4.adb: New test. + * gnat.dg/constant4_pkg.ads: New helper. + 2012-06-08 Janus Weil PR fortran/52552 diff --git a/gcc/testsuite/gnat.dg/constant4.adb b/gcc/testsuite/gnat.dg/constant4.adb new file mode 100644 index 00000000000..826823a6248 --- /dev/null +++ b/gcc/testsuite/gnat.dg/constant4.adb @@ -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 index 00000000000..f0c6f8ffdcd --- /dev/null +++ b/gcc/testsuite/gnat.dg/constant4_pkg.ads @@ -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; -- 2.30.2