From 1784b1eb1f22a802cf7e2f3529fa83a40bce1b20 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Wed, 18 Sep 2019 08:33:40 +0000 Subject: [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 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 --- gcc/ada/ChangeLog | 8 ++++++++ gcc/ada/sem_res.adb | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'gcc/ada') 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 + * 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 + * 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); -- cgit v1.1