decl.c (gnat_to_gnu_entity): Put volatile qualifier on types at the very end of the...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 10 Oct 2016 10:09:13 +0000 (10:09 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 10 Oct 2016 10:09:13 +0000 (10:09 +0000)
* gcc-interface/decl.c (gnat_to_gnu_entity): Put volatile qualifier
on types at the very end of the processing.
(gnat_to_gnu_param): Remove redundant test.
(change_qualified_type): Do nothing for unconstrained array types.

From-SVN: r240915

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/vfa.ads [new file with mode: 0644]

index 3965dcae747d8cf94083ba55d1f1b5a0110ad2fc..c324b85b3b8587f8065195653e8f0c6398a49bfb 100644 (file)
@@ -1,3 +1,10 @@
+2016-10-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (gnat_to_gnu_entity): Put volatile qualifier
+       on types at the very end of the processing.
+       (gnat_to_gnu_param): Remove redundant test.
+       (change_qualified_type): Do nothing for unconstrained array types.
+
 2016-10-10  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/utils2.c (find_common_type): Do not return the LHS type
index f820f8452bfefa3a44e46370becf86929e2fea68..0d45392a0b37d710b84d3f427438840f12e7ec1a 100644 (file)
@@ -4728,14 +4728,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
              && AGGREGATE_TYPE_P (gnu_type)
              && TYPE_BY_REFERENCE_P (gnu_type))
            SET_TYPE_MODE (gnu_type, BLKmode);
-
-         if (Treat_As_Volatile (gnat_entity))
-           {
-             const int quals
-               = TYPE_QUAL_VOLATILE
-                 | (Is_Atomic_Or_VFA (gnat_entity) ? TYPE_QUAL_ATOMIC : 0);
-             gnu_type = change_qualified_type (gnu_type, quals);
-           }
        }
 
       /* If this is a derived type, relate its alias set to that of its parent
@@ -4816,6 +4808,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
                             ? ALIAS_SET_COPY : ALIAS_SET_SUPERSET);
        }
 
+      if (Treat_As_Volatile (gnat_entity))
+       {
+         const int quals
+           = TYPE_QUAL_VOLATILE
+             | (Is_Atomic_Or_VFA (gnat_entity) ? TYPE_QUAL_ATOMIC : 0);
+         gnu_type = change_qualified_type (gnu_type, quals);
+       }
+
       if (!gnu_decl)
        gnu_decl = create_type_decl (gnu_entity_name, gnu_type,
                                     artificial_p, debug_info_p,
@@ -5386,12 +5386,9 @@ gnat_to_gnu_param (Entity_Id gnat_param, tree gnu_param_type, bool first,
     }
 
   /* If this is a read-only parameter, make a variant of the type that is
-     read-only.  ??? However, if this is an unconstrained array, that type
-     can be very complex, so skip it for now.  Likewise for any other
-     self-referential type.  */
-  if (ro_param
-      && TREE_CODE (gnu_param_type) != UNCONSTRAINED_ARRAY_TYPE
-      && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_param_type)))
+     read-only.  ??? However, if this is a self-referential type, the type
+     can be very complex, so skip it for now.  */
+  if (ro_param && !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_param_type)))
     gnu_param_type = change_qualified_type (gnu_param_type, TYPE_QUAL_CONST);
 
   /* For foreign conventions, pass arrays as pointers to the element type.
@@ -6254,6 +6251,10 @@ gnu_ext_name_for_subprog (Entity_Id gnat_subprog, tree gnu_entity_name)
 static tree
 change_qualified_type (tree type, int type_quals)
 {
+  /* Qualifiers must be put on the associated array type.  */
+  if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE)
+    return type;
+
   return build_qualified_type (type, TYPE_QUALS (type) | type_quals);
 }
 
index bf766822198d09f6a4a9b802f36f10a6f91d9162..da295904afead24b79b2b2a998dcbe8c25832543 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/specs/vfa.ads: New test.
+
 2016-10-10  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/inline13.ad[sb]: New test.
diff --git a/gcc/testsuite/gnat.dg/specs/vfa.ads b/gcc/testsuite/gnat.dg/specs/vfa.ads
new file mode 100644 (file)
index 0000000..a63be96
--- /dev/null
@@ -0,0 +1,14 @@
+-- { dg-do compile }
+-- { dg-options "-g" }
+
+package VFA is
+
+  type Rec is record
+    A : Short_Integer;
+    B : Short_Integer;
+  end record;
+
+  type Rec_VFA is new Rec;
+  pragma Volatile_Full_Access (Rec_VFA);
+
+end VFA;