decl.c (gnat_to_gnu_entity): If this is not a definition...
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 2 Jun 2018 11:11:40 +0000 (11:11 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 2 Jun 2018 11:11:40 +0000 (11:11 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Constant>: If this is
not a definition, retrieve the expression only if it's a compile-time
known value if we are just annotating types.

* gcc-interface/utils.c (convert): Do not try to upcast properly for a
conversion between tagged types in type_annotate_only mode.

From-SVN: r261113

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

index b180457534c9fa6e5639a72898b378fc87955165..6b883b9dd3a944ce04ec0c845dc12337925d828e 100644 (file)
@@ -1,3 +1,12 @@
+2018-06-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Constant>: If this is
+       not a definition, retrieve the expression only if it's a compile-time
+       known value if we are just annotating types.
+
+       * gcc-interface/utils.c (convert): Do not try to upcast properly for a
+       conversion between tagged types in type_annotate_only mode.
+
 2018-06-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/ada-tree.h (TYPE_PADDING_FOR_COMPONENT): New macro.
index 8f3595ec2633243cba7cf0d26f093736a127dc2c..c4828848703dd88471fd1836ff02a41b5c2612cf 100644 (file)
@@ -601,16 +601,16 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
         was defined to represent.  This is necessary to avoid generating dumb
         elaboration code in simple cases, but we may throw it away later if it
         is not a constant.  But do not retrieve it if it is an allocator since
-        the designated type might still be dummy at this point.  */
+        the designated type might still be dummy at this point.  Note that we
+        invoke gnat_to_gnu_external and not gnat_to_gnu because the expression
+        may contain N_Expression_With_Actions nodes and thus declarations of
+        objects from other units that we need to discard.  */
       if (!definition
          && !No_Initialization (Declaration_Node (gnat_entity))
-         && Present (Expression (Declaration_Node (gnat_entity)))
-         && Nkind (Expression (Declaration_Node (gnat_entity)))
-            != N_Allocator)
-         /* The expression may contain N_Expression_With_Actions nodes and
-            thus object declarations from other units.  Discard them.  */
-       gnu_expr
-         = gnat_to_gnu_external (Expression (Declaration_Node (gnat_entity)));
+         && Present (gnat_temp = Expression (Declaration_Node (gnat_entity)))
+         && Nkind (gnat_temp) != N_Allocator
+         && (!type_annotate_only || Compile_Time_Known_Value (gnat_temp)))
+       gnu_expr = gnat_to_gnu_external (gnat_temp);
 
       /* ... fall through ... */
 
index 7de766375d43c30b5b26d55297c1914cc27b60f4..d415f492cb94b0b91950ec79eeba8be2a9eec91b 100644 (file)
@@ -4631,9 +4631,12 @@ convert (tree type, tree expr)
                                           etype)))
     return build1 (VIEW_CONVERT_EXPR, type, expr);
 
-  /* If we are converting between tagged types, try to upcast properly.  */
+  /* If we are converting between tagged types, try to upcast properly.
+     But don't do it if we are just annotating types since tagged types
+     aren't fully laid out in this mode.  */
   else if (ecode == RECORD_TYPE && code == RECORD_TYPE
-          && TYPE_ALIGN_OK (etype) && TYPE_ALIGN_OK (type))
+          && TYPE_ALIGN_OK (etype) && TYPE_ALIGN_OK (type)
+          && !type_annotate_only)
     {
       tree child_etype = etype;
       do {