From 3c28a5f48c173ca546369b2434c0701009320569 Mon Sep 17 00:00:00 2001
From: Eric Botcazou <ebotcazou@adacore.com>
Date: Wed, 21 Oct 2009 10:20:06 +0000
Subject: [PATCH] decl.c (build_subst_list): Convert the expression of the
 constraint to the type of the discriminant.

	* gcc-interfaces/decl.c (build_subst_list): Convert the expression of
	the constraint to the type of the discriminant.

From-SVN: r153054
---
 gcc/ada/ChangeLog                 |  5 +++++
 gcc/ada/gcc-interface/decl.c      | 16 ++++++++++------
 gcc/testsuite/ChangeLog           |  4 ++++
 gcc/testsuite/gnat.dg/discr22.adb | 23 +++++++++++++++++++++++
 4 files changed, 42 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/gnat.dg/discr22.adb

diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 5d69cee05942..e4761d82e1fe 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gcc-interfaces/decl.c (build_subst_list): Convert the expression of
+	the constraint to the type of the discriminant.
+
 2009-10-21  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* gcc-interfaces/decl.c (gnat_to_gnu_entity): Do not create a new
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 70ced844fb6a..d0b52f2e7457 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -7374,12 +7374,16 @@ build_subst_list (Entity_Id gnat_subtype, Entity_Id gnat_type, bool definition)
        gnat_value = Next_Elmt (gnat_value))
     /* Ignore access discriminants.  */
     if (!Is_Access_Type (Etype (Node (gnat_value))))
-      gnu_list = tree_cons (gnat_to_gnu_field_decl (gnat_discrim),
-			    elaborate_expression
-			    (Node (gnat_value), gnat_subtype,
-			     get_entity_name (gnat_discrim), definition,
-			     true, false),
-			    gnu_list);
+      {
+	tree gnu_field = gnat_to_gnu_field_decl (gnat_discrim);
+	gnu_list = tree_cons (gnu_field,
+			      convert (TREE_TYPE (gnu_field),
+				       elaborate_expression
+				       (Node (gnat_value), gnat_subtype,
+					get_entity_name (gnat_discrim),
+					definition, true, false)),
+			      gnu_list);
+      }
 
   return gnu_list;
 }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae7687def705..e827cc9eec74 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-10-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gnat.dg/discr22.adb: New test.
+
 2009-10-21  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* gnat.dg/loop_optimization7.ad[sb]: New test.
diff --git a/gcc/testsuite/gnat.dg/discr22.adb b/gcc/testsuite/gnat.dg/discr22.adb
new file mode 100644
index 000000000000..af4f9ab78997
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/discr22.adb
@@ -0,0 +1,23 @@
+-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+procedure Discr22 is
+
+   subtype Precision is Integer range 1 .. 5;
+
+   type Rec(D1 : Precision; D2 : Integer) is record
+      case D1 is
+         when 1 => I : Integer;
+         when others => null;
+      end case;
+   end record;
+   for Rec use record
+      D1 at 0 range 0 .. 7;
+   end record;
+
+   P : Precision;
+   X : Rec(P, 0);
+
+begin
+   null;
+end;
-- 
GitLab