Commit 17dd35f4 by Ed Schonberg Committed by Pierre-Marie de Rodat

[Ada] Spurious error on fixed-point operation whose operands are expressions

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
parent bf5899e7
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
......
......@@ -5283,9 +5283,19 @@ package body Sem_Res is
elsif Etype (N) = T
and then B_Typ /= Universal_Fixed
then
-- 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
......
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.
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment