aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2019-09-18 08:33:40 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-09-18 08:33:40 +0000
commit1784b1eb1f22a802cf7e2f3529fa83a40bce1b20 (patch)
tree5ea4a99b687ba7abbe9f1ac73d3a74b65a87a919 /gcc/ada
parent0cff31f0f67a88fd1bf76bab430eaa0adac94ffa (diff)
downloadgcc-1784b1eb1f22a802cf7e2f3529fa83a40bce1b20.zip
gcc-1784b1eb1f22a802cf7e2f3529fa83a40bce1b20.tar.gz
gcc-1784b1eb1f22a802cf7e2f3529fa83a40bce1b20.tar.bz2
[Ada] Crash on universal case expression in fixed-point division
This patch fixes a compiler abort on a case expression whose alternatives are universal_real constants, when the case expression is an operand in a multiplication or division whose other operand is of a fixed-point type. 2019-09-18 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * sem_res.adb (Set_Mixed_Node_Expression): If a conditional expression has universal_real alternaitves and the context is Universal_Fixed, as when it is an operand in a fixed-point multiplication or division, resolve the expression with a visible fixed-point type, which must be unique. gcc/testsuite/ * gnat.dg/fixedpnt8.adb: New testcase. From-SVN: r275864
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog8
-rw-r--r--gcc/ada/sem_res.adb12
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index d9b552a..2a5ca04 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,13 @@
2019-09-18 Ed Schonberg <schonberg@adacore.com>
+ * sem_res.adb (Set_Mixed_Node_Expression): If a conditional
+ expression has universal_real alternaitves and the context is
+ Universal_Fixed, as when it is an operand in a fixed-point
+ multiplication or division, resolve the expression with a
+ visible fixed-point type, which must be unique.
+
+2019-09-18 Ed Schonberg <schonberg@adacore.com>
+
* sem_ch3.adb (Constrain_Component_Type): For a discriminated
type, handle the case of a constraint given by a conversion of a
discriminant of the enclosing type. Necessary when compiling a
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index 7a52b90..38de57d 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -5674,13 +5674,21 @@ package body Sem_Res is
-- A universal real conditional expression can appear in a fixed-type
-- context and must be resolved with that context to facilitate the
- -- code generation in the back end.
+ -- code generation in the back end. However, If the context is
+ -- Universal_fixed (i.e. as an operand of a multiplication/division
+ -- involving a fixed-point operand) the conditional expression must
+ -- resolve to a unique visible fixed_point type, normally Duration.
elsif Nkind_In (N, N_Case_Expression, N_If_Expression)
and then Etype (N) = Universal_Real
and then Is_Fixed_Point_Type (B_Typ)
then
- Resolve (N, B_Typ);
+ if B_Typ = Universal_Fixed then
+ Resolve (N, Unique_Fixed_Point_Type (N));
+
+ else
+ Resolve (N, B_Typ);
+ end if;
else
Resolve (N);