Thread overview
[Issue 3671] New: x^^3 gives wrong result when x is a floating-point literal
Jan 04, 2010
Don
Jan 12, 2010
Walter Bright
Jan 31, 2010
Walter Bright
January 04, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3671

           Summary: x^^3 gives wrong result when x is a floating-point
                    literal
           Product: D
           Version: 2.038
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: bugzilla@kyllingen.net


--- Comment #0 from Lars T. Kyllingstad <bugzilla@kyllingen.net> 2010-01-04 03:30:57 PST ---
x^^3 evaluates to x^^2 when x is a floating-point literal.

  writeln(2.0^^3);  // prints 4

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 04, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3671


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

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


--- Comment #1 from Don <clugdbug@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: -------
January 12, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3671


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla@digitalmars.com


--- Comment #2 from Walter Bright <bugzilla@digitalmars.com> 2010-01-11 22:01:23 PST ---
Changeset 332

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 31, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3671


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


--- Comment #3 from Walter Bright <bugzilla@digitalmars.com> 2010-01-30 22:46:39 PST ---
fixed dmd 2.040

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