D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 3671 - x^^3 gives wrong result when x is a floating-point literal
Summary: x^^3 gives wrong result when x is a floating-point literal
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: Other All
: P2 critical
Assignee: No Owner
URL:
Keywords: patch, wrong-code
Depends on:
Blocks:
 
Reported: 2010-01-04 03:30 UTC by Lars T. Kyllingstad
Modified: 2015-06-09 01:27 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Lars T. Kyllingstad 2010-01-04 03:30:57 UTC
x^^3 evaluates to x^^2 when x is a floating-point literal.

  writeln(2.0^^3);  // prints 4
Comment 1 Don 2010-01-04 04:17:59 UTC
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);
Comment 2 Walter Bright 2010-01-11 22:01:23 UTC
Changeset 332
Comment 3 Walter Bright 2010-01-30 22:46:39 UTC
fixed dmd 2.040