[Ada] Spurious error on fixed-point operation whose operands are expressions
authorEd Schonberg <schonberg@adacore.com>
Fri, 25 May 2018 09:05:21 +0000 (09:05 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 25 May 2018 09:05:21 +0000 (09:05 +0000)
This patch fixes a spurious error in a fixed-point operand of a multiplying
operator M when the operand is an adding operation and the context imposes
a different fixed-point type to the result of M.

2018-05-25  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_res.adb (Set_Mixed_Mode_Operand): If the operand is an expression
of a fixed point type and the parent is a multiplying operation,
resolve the operand with its own type because the context will impose a
resulting type on the result of the multiplication by means of
approriate conversion.

gcc/testsuite/

* gnat.dg/fixedpnt4.adb: New testcase.

From-SVN: r260741

gcc/ada/ChangeLog
gcc/ada/sem_res.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/fixedpnt4.adb [new file with mode: 0644]

index ba22139a02bc44c1db1fc96d1db4be9f3121cc31..66b84916ed97000f85f240b6bd79e8a8b6a2a69e 100644 (file)
@@ -1,3 +1,11 @@
+2018-05-25  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_res.adb (Set_Mixed_Mode_Operand): If the operand is an expression
+       of a fixed point type and the parent is a multiplying operation,
+       resolve the operand with its own type because the context will impose a
+       resulting type on the result of the multiplication by means of
+       approriate conversion.
+
 2018-05-25  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * exp_ch3.adb (Default_Initialize_Object): Ensure that the analysis of
index a71e5830ef5f8dfabd19a21c79338884574376bb..d11296c9e57fb2ce0d86442c89b95455cdc9fe51 100644 (file)
@@ -5283,9 +5283,19 @@ package body Sem_Res is
          elsif Etype (N) = T
            and then B_Typ /= Universal_Fixed
          then
-            --  Not a mixed-mode operation, resolve with context
 
-            Resolve (N, B_Typ);
+            --  if the operand is part of a fixed multiplication operation,
+            --  a conversion will be applied to each operand, so resolve it
+            --  with its own type.
+
+            if Nkind_In (Parent (N), N_Op_Multiply, N_Op_Divide)  then
+               Resolve (N);
+
+            else
+               --  Not a mixed-mode operation, resolve with context
+
+               Resolve (N, B_Typ);
+            end if;
 
          elsif Etype (N) = Any_Fixed then
 
index 821a12dc6ce6fbfcd1c1fde9692c33bd2a28297e..2b2695e8c75e429ad3db2e5db9619c5e3ca42961 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-25  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/fixedpnt4.adb: New testcase.
+
 2018-05-25  Javier Miranda  <miranda@adacore.com>
 
        * gnat.dg/interface7.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/fixedpnt4.adb b/gcc/testsuite/gnat.dg/fixedpnt4.adb
new file mode 100644 (file)
index 0000000..5025298
--- /dev/null
@@ -0,0 +1,14 @@
+--  { dg-do compile }
+
+procedure Fixedpnt4 is
+   type T is delta 2.0/5.0 range -10.0 .. 10.0 with Small => 2.0/5.0;
+   type T2 is delta 1.0/25.0 range -10.0 .. 10.0 with Small => 1.0/25.0;
+
+   X : T := 1.0;
+   Y : T2;
+begin
+   Y := X / X;
+   Y := X / (X + X);
+   Y := X / (X + X + 1.0);
+   Y := (X + X) * (X + X);
+end;