summaryrefslogtreecommitdiff
path: root/gcc/ada/exp_fixd.adb
diff options
context:
space:
mode:
authorbosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-12 00:05:45 +0000
committerbosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-12 00:05:45 +0000
commit1a2fca859b57e136b977146cdf1e238eb094fcc4 (patch)
tree2ab1cc5e894069a7e123077ef2642ab7c5656658 /gcc/ada/exp_fixd.adb
parentad9b787efbfff948a2d4484b556c2f9c33feda19 (diff)
downloadgcc-1a2fca859b57e136b977146cdf1e238eb094fcc4.tar.gz
* exp_fixd.adb (Expand_Multiply_Fixed_By_Fixed_Giving_Fixed): handle
properly the case where one universal operand in a non-static exponentiation of a real literal. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46211 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/exp_fixd.adb')
-rw-r--r--gcc/ada/exp_fixd.adb35
1 files changed, 32 insertions, 3 deletions
diff --git a/gcc/ada/exp_fixd.adb b/gcc/ada/exp_fixd.adb
index 656173f47f1..0eba7e2673e 100644
--- a/gcc/ada/exp_fixd.adb
+++ b/gcc/ada/exp_fixd.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- $Revision: 1.54 $
+-- $Revision$
-- --
-- Copyright (C) 1992-2001 Free Software Foundation, Inc. --
-- --
@@ -2082,12 +2082,41 @@ package body Exp_Fixd is
Left : constant Node_Id := Left_Opnd (N);
Right : constant Node_Id := Right_Opnd (N);
+ procedure Rewrite_Non_Static_Universal (Opnd : Node_Id);
+ -- The operand may be a non-static universal value, such an
+ -- exponentiation with a non-static exponent. In that case, treat
+ -- as a fixed * fixed multiplication, and convert the argument to
+ -- the target fixed type.
+
+ procedure Rewrite_Non_Static_Universal (Opnd : Node_Id) is
+ Loc : constant Source_Ptr := Sloc (N);
+
+ begin
+ Rewrite (Opnd,
+ Make_Type_Conversion (Loc,
+ Subtype_Mark => New_Occurrence_Of (Etype (N), Loc),
+ Expression => Expression (Opnd)));
+ Analyze_And_Resolve (Opnd, Etype (N));
+ end Rewrite_Non_Static_Universal;
+
begin
if Etype (Left) = Universal_Real then
- Do_Multiply_Fixed_Universal (N, Right, Left);
+ if Nkind (Left) = N_Real_Literal then
+ Do_Multiply_Fixed_Universal (N, Right, Left);
+
+ elsif Nkind (Left) = N_Type_Conversion then
+ Rewrite_Non_Static_Universal (Left);
+ Do_Multiply_Fixed_Fixed (N);
+ end if;
elsif Etype (Right) = Universal_Real then
- Do_Multiply_Fixed_Universal (N, Left, Right);
+ if Nkind (Right) = N_Real_Literal then
+ Do_Multiply_Fixed_Universal (N, Left, Right);
+
+ elsif Nkind (Right) = N_Type_Conversion then
+ Rewrite_Non_Static_Universal (Right);
+ Do_Multiply_Fixed_Fixed (N);
+ end if;
else
Do_Multiply_Fixed_Fixed (N);