summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2017-10-21 09:53:50 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2017-10-21 09:53:50 +0000
commit236b0552f8fada3afce1bee489b7cf7b631e854e (patch)
tree48d7c79808055d5104d804c65080c2e63372599c
parent1148eb54e7602dfce6b03e34658f6c1814148cd5 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/utils.c16
-rw-r--r--gcc/testsuite/ChangeLog9
-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.ads23
-rw-r--r--gcc/testsuite/gnat.dg/specs/discr4_pkg.ads27
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;