aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/utils.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/aggr16.adb26
-rw-r--r--gcc/testsuite/gnat.dg/aggr16.ads5
-rw-r--r--gcc/testsuite/gnat.dg/aggr16_pkg.ads27
6 files changed, 72 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index f631f84..1ef253c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-23 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/utils.c (gnat_types_compatible_p): Revert latest change
+ and recurse only for multidimensional array types instead.
+
2010-07-22 Eric Botcazou <ebotcazou@adacore.com>
PR ada/44892
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 541f7bb..7752edb 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -2081,7 +2081,7 @@ gnat_types_compatible_p (tree t1, tree t2)
return 1;
/* Array types are also compatible if they are constrained and have the same
- domain and compatible component types. */
+ domain(s) and the same component type. */
if (code == ARRAY_TYPE
&& (TYPE_DOMAIN (t1) == TYPE_DOMAIN (t2)
|| (TYPE_DOMAIN (t1)
@@ -2090,7 +2090,9 @@ gnat_types_compatible_p (tree t1, tree t2)
TYPE_MIN_VALUE (TYPE_DOMAIN (t2)))
&& tree_int_cst_equal (TYPE_MAX_VALUE (TYPE_DOMAIN (t1)),
TYPE_MAX_VALUE (TYPE_DOMAIN (t2)))))
- && gnat_types_compatible_p (TREE_TYPE (t1), TREE_TYPE (t2)))
+ && (TREE_TYPE (t1) == TREE_TYPE (t2)
+ || (TREE_CODE (TREE_TYPE (t1)) == ARRAY_TYPE
+ && gnat_types_compatible_p (TREE_TYPE (t1), TREE_TYPE (t2)))))
return 1;
/* Padding record types are also compatible if they pad the same
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9e8c046..bdc2660 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-23 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/aggr16.ad[sb]: New test.
+ * gnat.dg/aggr16_pkg.ads: New helper.
+
2010-07-23 Richard Guenther <rguenther@suse.de>
PR lto/43071
diff --git a/gcc/testsuite/gnat.dg/aggr16.adb b/gcc/testsuite/gnat.dg/aggr16.adb
new file mode 100644
index 0000000..2f559da
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr16.adb
@@ -0,0 +1,26 @@
+-- { dg-do compile }
+
+with Aggr16_Pkg; use Aggr16_Pkg;
+
+package body Aggr16 is
+
+ type Arr is array (1 .. 4) of Time;
+
+ type Change_Type is (One, Two, Three);
+
+ type Change (D : Change_Type) is record
+ case D is
+ when Three =>
+ A : Arr;
+ when Others =>
+ B : Boolean;
+ end case;
+ end record;
+
+ procedure Proc is
+ C : Change (Three);
+ begin
+ C.A := (others => Null_Time);
+ end;
+
+end Aggr16;
diff --git a/gcc/testsuite/gnat.dg/aggr16.ads b/gcc/testsuite/gnat.dg/aggr16.ads
new file mode 100644
index 0000000..3a4b0d1
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr16.ads
@@ -0,0 +1,5 @@
+package Aggr16 is
+
+ procedure Proc;
+
+end Aggr16;
diff --git a/gcc/testsuite/gnat.dg/aggr16_pkg.ads b/gcc/testsuite/gnat.dg/aggr16_pkg.ads
new file mode 100644
index 0000000..8bacbc9
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr16_pkg.ads
@@ -0,0 +1,27 @@
+package Aggr16_Pkg is
+
+ type Time_Type is (A, B);
+
+ type Time (D : Time_Type := A) is private;
+
+ Null_Time : constant Time;
+
+private
+
+ type Hour is record
+ I1 : Integer;
+ I2 : Integer;
+ end record;
+
+ type Time (D : Time_Type := A) is record
+ case D is
+ when A =>
+ A_Time : Integer;
+ when B =>
+ B_Time : Hour;
+ end case;
+ end record;
+
+ Null_Time : constant Time := (A, 0);
+
+end Aggr16_Pkg;