Testing showed that gdb was not correctly handling some fixed-point binary operations correctly. Addition and subtraction worked by casting the result to the type of left hand operand. So, "fixed+int" had a different type -- and different value -- from "int+fixed". Furthermore, for multiplication and division, it does not make sense to first cast both sides to the fixed-point type. For example, this can prevent "f * 1" from yielding "f", if 1 is not in the domain of "f". Instead, this patch changes gdb to use the value. (This is somewhat different from Ada semantics, as those can yield a "universal fixed point".) This includes a new test case. It is only run in "minimal" mode, as the old-style fixed point works differently, and is obsolete, so I have no plans to change it. gdb/ChangeLog 2021-01-06 Tom Tromey <tromey@adacore.com> * ada-lang.c (ada_evaluate_subexp) <BINOP_ADD, BINOP_SUB>: Do not cast result. * valarith.c (fixed_point_binop): Handle multiplication and division specially. * valops.c (value_to_gdb_mpq): New function. (value_cast_to_fixed_point): Use it. gdb/testsuite/ChangeLog 2021-01-06 Tom Tromey <tromey@adacore.com> * gdb.ada/fixed_points/pck.ads (Delta4): New constant. (FP4_Type): New type. (FP4_Var): New variable. * gdb.ada/fixed_points/fixed_points.adb: Update. * gdb.ada/fixed_points.exp: Add tests for binary operators.
36 lines
1.2 KiB
Ada
36 lines
1.2 KiB
Ada
-- Copyright 2016-2021 Free Software Foundation, Inc.
|
|
--
|
|
-- This program is free software; you can redistribute it and/or modify
|
|
-- it under the terms of the GNU General Public License as published by
|
|
-- the Free Software Foundation; either version 3 of the License, or
|
|
-- (at your option) any later version.
|
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License
|
|
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
with System;
|
|
|
|
package Pck is
|
|
type FP1_Type is delta 0.1 range -1.0 .. +1.0;
|
|
FP1_Var : FP1_Type := 0.25;
|
|
|
|
type FP2_Type is delta 0.01 digits 14;
|
|
FP2_Var : FP2_Type := -0.01;
|
|
|
|
type FP3_Type is delta 0.1 range 0.0 .. 1.0 with Small => 0.1/3.0;
|
|
FP3_Var : FP3_Type := 0.1;
|
|
|
|
Delta4 : constant := 0.000_000_1;
|
|
type FP4_Type is delta Delta4 range 0.0 .. Delta4 * 10
|
|
with Small => Delta4 / 3.0;
|
|
FP4_Var : FP4_Type := 2 * Delta4;
|
|
|
|
procedure Do_Nothing (A : System.Address);
|
|
end pck;
|
|
|