* gcc-interface/trans.c (Identifier_to_gnu): Don't unshare initializer.
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Mar 2012 18:55:59 +0000 (18:55 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 7 Mar 2012 18:55:59 +0000 (18:55 +0000)
(add_decl_expr): Mark external DECLs as used.
* gcc-interface/utils.c (convert) <CONSTRUCTOR>: Copy the vector.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185072 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/ada/gcc-interface/utils.c

index 62d5ea9..65fc50a 100644 (file)
@@ -1,3 +1,9 @@
+2012-03-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (Identifier_to_gnu): Don't unshare initializer.
+       (add_decl_expr): Mark external DECLs as used.
+       * gcc-interface/utils.c (convert) <CONSTRUCTOR>: Copy the vector.
+
 2012-03-07  Tristan Gingold  <gingold@adacore.com>
 
        * s-ransee-vms.adb: New file.
index eebe2a9..860e0dc 100644 (file)
@@ -1102,11 +1102,9 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
          = lvalue_required_p (gnat_node, gnu_result_type, true,
                               address_of_constant, Is_Aliased (gnat_temp));
 
-      /* ??? We need to unshare the initializer if the object is external
-        as such objects are not marked for unsharing if we are not at the
-        global level.  This should be fixed in add_decl_expr.  */
+      /* Finally retrieve the initializer if this is deemed valid.  */
       if ((constant_only && !address_of_constant) || !require_lvalue)
-       gnu_result = unshare_expr (DECL_INITIAL (gnu_result));
+       gnu_result = DECL_INITIAL (gnu_result);
     }
 
   /* The GNAT tree has the type of a function set to its result type, so we
@@ -7113,10 +7111,10 @@ add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
 
   gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
 
-  /* If we are global, we don't want to actually output the DECL_EXPR for
-     this decl since we already have evaluated the expressions in the
+  /* If we are external or global, we don't want to output the DECL_EXPR for
+     this DECL node since we already have evaluated the expressions in the
      sizes and positions as globals and doing it again would be wrong.  */
-  if (global_bindings_p ())
+  if (DECL_EXTERNAL (gnu_decl) || global_bindings_p ())
     {
       /* Mark everything as used to prevent node sharing with subprograms.
         Note that walk_tree knows how to deal with TYPE_DECL, but neither
@@ -7135,7 +7133,7 @@ add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
               && !TYPE_FAT_POINTER_P (type))
        MARK_VISITED (TYPE_ADA_SIZE (type));
     }
-  else if (!DECL_EXTERNAL (gnu_decl))
+  else
     add_stmt_with_node (gnu_stmt, gnat_entity);
 
   /* If this is a variable and an initializer is attached to it, it must be
index 062df3a..f9214fb 100644 (file)
@@ -3894,6 +3894,8 @@ convert (tree type, tree expr)
        {
          expr = copy_node (expr);
          TREE_TYPE (expr) = type;
+         CONSTRUCTOR_ELTS (expr)
+           = VEC_copy (constructor_elt, gc, CONSTRUCTOR_ELTS (expr));
          return expr;
        }