[Issue 3671] x^^3 gives wrong result when x is a floating-point literal

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Jan 4 04:18:00 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=3671


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug at yahoo.com.au
           Severity|major                       |critical


--- Comment #1 from Don <clugdbug at yahoo.com.au> 2010-01-04 04:17:59 PST ---
Ouch. I don't know what's happened here. The test suite I provided with the
patch in bug 3577 doesn't compile! 
This quick patch fixes the immediate bug reported here, but it still doesn't
compile the 3577 test suite.
The culprit is the call to typeCombine(). The test needs to be performed before
that.

Index: expression.c
===================================================================
--- expression.c    (revision 324)
+++ expression.c    (working copy)
@@ -9965,6 +9971,9 @@
          ) && (e1->op == TOKint64 || e1->op == TOKfloat64)
        )
     {
+        bool wantCube = (e2->op == TOKint64 && e2->toInteger() == 3) 
+          || (e2->op == TOKfloat64 && e2->toReal() == 3.0);
+          
         typeCombine(sc);
         // Replace x^^2 with (tmp = x, tmp*tmp)
         // Replace x^^3 with (tmp = x, tmp*tmp*tmp) 
@@ -9973,8 +9982,8 @@
         VarExp * ve = new VarExp(loc, tmp);
         Expression *ae = new DeclarationExp(loc, tmp);
         Expression *me = new MulExp(loc, ve, ve);
-        if ( (e2->op == TOKint64 && e2->toInteger() == 3) 
-          || (e2->op == TOKfloat64 && e2->toReal() == 3.0))
+
+        if ( wantCube)
         me = new MulExp(loc, me, ve);
         e = new CommaExp(loc, ae, me);
         e = e->semantic(sc);

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list