diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-10-21 09:53:50 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-10-21 09:53:50 +0000 |
commit | 236b0552f8fada3afce1bee489b7cf7b631e854e (patch) | |
tree | 48d7c79808055d5104d804c65080c2e63372599c | |
parent | 1148eb54e7602dfce6b03e34658f6c1814148cd5 (diff) | |
download | gcc-236b0552f8fada3afce1bee489b7cf7b631e854e.tar.gz |
* gcc-interface/utils.c (pad_type_hash): Use hashval_t for hash value.
(convert): Do not use an unchecked conversion for converting from a
type to another type padding it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@253971 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/discr2.ads (renamed from gcc/testsuite/gnat.dg/specs/discr_private.ads) | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/discr3.ads (renamed from gcc/testsuite/gnat.dg/specs/discr_record_constant.ads) | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/discr4.ads | 23 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/discr4_pkg.ads | 27 |
7 files changed, 79 insertions, 10 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index dac7791a8e6..308ec70a775 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2017-10-21 Eric Botcazou <ebotcazou@adacore.com> + + * gcc-interface/utils.c (pad_type_hash): Use hashval_t for hash value. + (convert): Do not use an unchecked conversion for converting from a + type to another type padding it. + 2017-10-20 Doug Rupp <rupp@adacore.com> * libgnarl/s-osinte__linux.ads (Relative_Timed_Wait): Add variable diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 99453821e41..bfd3388c56a 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -101,7 +101,7 @@ static tree handle_vector_type_attribute (tree *, tree, tree, int, bool *); /* Fake handler for attributes we don't properly support, typically because they'd require dragging a lot of the common-c front-end circuitry. */ -static tree fake_attribute_handler (tree *, tree, tree, int, bool *); +static tree fake_attribute_handler (tree *, tree, tree, int, bool *); /* Table of machine-independent internal attributes for Ada. We support this minimal set of attributes to accommodate the needs of builtins. */ @@ -222,8 +222,9 @@ static GTY((deletable)) tree free_block_chain; /* A hash table of padded types. It is modelled on the generic type hash table in tree.c, which must thus be used as a reference. */ -struct GTY((for_user)) pad_type_hash { - unsigned long hash; +struct GTY((for_user)) pad_type_hash +{ + hashval_t hash; tree type; }; @@ -4249,10 +4250,13 @@ convert (tree type, tree expr) return convert (type, TREE_OPERAND (expr, 0)); /* If the inner type is of self-referential size and the expression type - is a record, do this as an unchecked conversion. But first pad the - expression if possible to have the same size on both sides. */ + is a record, do this as an unchecked conversion unless both types are + essentially the same. But first pad the expression if possible to + have the same size on both sides. */ if (ecode == RECORD_TYPE - && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type)))) + && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type))) + && TYPE_MAIN_VARIANT (etype) + != TYPE_MAIN_VARIANT (TREE_TYPE (TYPE_FIELDS (type)))) { if (TREE_CODE (TYPE_SIZE (etype)) == INTEGER_CST) expr = convert (maybe_pad_type (etype, TYPE_SIZE (type), 0, Empty, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 12f9f6d98c4..1380165912e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2017-10-21 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/specs/discr_private.ads: Rename into ... + * gnat.dg/specs/discr2.ads: ...this. + * gnat.dg/specs/discr_record_constant.ads: Rename into... + * gnat.dg/specs/discr3.ads: ...this. + * gnat.dg/specs/discr4.ads: New test. + * gnat.dg/specs/discr4_pkg.ads: New helper. + 2017-10-21 Paul Thomas <pault@gcc.gnu.org> PR fortran/82586 diff --git a/gcc/testsuite/gnat.dg/specs/discr_private.ads b/gcc/testsuite/gnat.dg/specs/discr2.ads index 0ddfbd137ff..f7ece058812 100644 --- a/gcc/testsuite/gnat.dg/specs/discr_private.ads +++ b/gcc/testsuite/gnat.dg/specs/discr2.ads @@ -1,7 +1,7 @@ -- { dg-do compile } -- { dg-options "-gnatws" } -package Discr_Private is +package Discr2 is package Dec is type T_DECIMAL (Prec : Integer := 1) is private; @@ -47,4 +47,4 @@ package Discr_Private is end case; end record; -end Discr_Private; +end Discr2; diff --git a/gcc/testsuite/gnat.dg/specs/discr_record_constant.ads b/gcc/testsuite/gnat.dg/specs/discr3.ads index f43b1386909..bcb996b7386 100644 --- a/gcc/testsuite/gnat.dg/specs/discr_record_constant.ads +++ b/gcc/testsuite/gnat.dg/specs/discr3.ads @@ -2,7 +2,7 @@ pragma Restrictions (No_Implicit_Heap_Allocations); -package Discr_Record_Constant is +package Discr3 is type T (Big : Boolean := False) is record case Big is @@ -19,4 +19,4 @@ package Discr_Record_Constant is Con : constant T := D; -- Violation of restriction Ter : constant T := Con; -- Violation of restriction -end Discr_Record_Constant; +end Discr3; diff --git a/gcc/testsuite/gnat.dg/specs/discr4.ads b/gcc/testsuite/gnat.dg/specs/discr4.ads new file mode 100644 index 00000000000..ef9f046abcd --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/discr4.ads @@ -0,0 +1,23 @@ +-- { dg-do compile } +-- { dg-options "-O" } + +with Disc4_Pkg; use Disc4_Pkg; + +package Disc4 is + + type Data is record + Val : Rec; + Set : Boolean; + end record; + + type Pair is record + Lower, Upper : Data; + end record; + + function Build (L, U : Rec) return Pair is ((L, True), (U, False)); + + C1 : constant Pair := Build (Rec_One, Rec_Three); + + C2 : constant Pair := Build (Get (0), Rec_Three); + +end Disc4; diff --git a/gcc/testsuite/gnat.dg/specs/discr4_pkg.ads b/gcc/testsuite/gnat.dg/specs/discr4_pkg.ads new file mode 100644 index 00000000000..4b6c573729d --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/discr4_pkg.ads @@ -0,0 +1,27 @@ +package Disc4_Pkg is + + type Enum is (One, Two, Three); + + type Rec is private; + + Rec_One : constant Rec; + Rec_Three : constant Rec; + + function Get (Value : Integer) return Rec; + +private + + type Rec (D : Enum := Two) is record + case D is + when One => null; + when Two => Value : Integer; + when Three => null; + end case; + end record; + + Rec_One : constant Rec := (D => One); + Rec_Three : constant Rec := (D => Three); + + function Get (Value : Integer) return Rec is (Two, Value); + +end Disc4_Pkg; |