From 41683e1a62f06f2791c9651d739cc69a5a60b07e Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 10 Oct 2016 10:09:13 +0000 Subject: [PATCH] decl.c (gnat_to_gnu_entity): Put volatile qualifier on types at the very end of the processing. * 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 | 7 +++++++ gcc/ada/gcc-interface/decl.c | 29 +++++++++++++++-------------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/specs/vfa.ads | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/specs/vfa.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3965dcae747..c324b85b3b8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2016-10-10 Eric Botcazou + + * 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 * gcc-interface/utils2.c (find_common_type): Do not return the LHS type diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index f820f8452bf..0d45392a0b3 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf766822198..da295904afe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-10-10 Eric Botcazou + + * gnat.dg/specs/vfa.ads: New test. + 2016-10-10 Eric Botcazou * 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 index 00000000000..a63be969d55 --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/vfa.ads @@ -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; -- 2.30.2