digitalmars.D.bugs - [Issue 5117] New: [CTFE] Member function call with chained dots: side effects ignored
- d-bugmail puremagic.com (48/48) Oct 25 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5117
- d-bugmail puremagic.com (48/48) Oct 25 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5117
- d-bugmail puremagic.com (30/30) Oct 29 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5117
- d-bugmail puremagic.com (16/16) Nov 07 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5117
- d-bugmail puremagic.com (17/27) Nov 08 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5117
- d-bugmail puremagic.com (12/12) Nov 10 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5117
http://d.puremagic.com/issues/show_bug.cgi?id=5117
Summary: [CTFE] Member function call with chained dots: side
effects ignored
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Keywords: wrong-code
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody puremagic.com
ReportedBy: rsinfu gmail.com
---
The interpretor neglects member functions mutating 'this' if a function call
involves two or more chained dot expressions. In the following repro,
s.change() succeeds in mutating 'this' but r.s.change() does not:
--------------------
static int dummy = test();
int test()
{
S s;
s.change();
assert(s.value == 1); // (7) succeeds
R r;
r.s.change();
assert(r.s.value == 1); // (11) fails, value == 0
return 0;
}
struct S
{
int value;
void change() { value = 1; }
}
struct R
{
S s;
}
--------------------
% dmd -o- -c test.d
test.d(11): Error: assert(r.s.value == 1) failed
test.d(1): Error: cannot evaluate test() at compile time
test.d(1): Error: cannot evaluate test() at compile time
--------------------
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 25 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5117
Shin Fujishiro <rsinfu gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Summary|[CTFE] Member function call |[CTFE] Member function call
|with chained dots: side |with rather complex this:
|effects ignored |side effects ignored
---
The problem lies in FuncDeclralation::interpret(), around line 223:
--------------------
// Don't restore the value of 'this' upon function return
if (needThis() && thisarg->op == TOKvar && istate)
{
VarDeclaration *thisvar = ((VarExp
*)(thisarg))->var->isVarDeclaration();
for (size_t i = 0; i < istate->vars.dim; i++)
{ VarDeclaration *v = (VarDeclaration *)istate->vars.data[i];
if (v == thisvar)
{ istate->vars.data[i] = NULL;
break;
}
}
}
--------------------
variable 'r' is not removed from the "restore list" istate->vars. Then, the
interpretor wrongly restores 'r' to init.
Just dealing with TOKdotvar fixes the specific reported problem, but it's not a
general fix. Still the interpretor should deal with references. For example:
--------------------
enum dummy = test();
int test()
{
S s;
getRef(s).change();
assert(s.value == 1); // fails, value == 0
return 0;
}
ref S getRef(ref S s) { return s; }
struct S
{
int value;
void change() { value = 1; }
}
--------------------
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 25 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5117
Don <clugdbug yahoo.com.au> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |patch
CC| |clugdbug yahoo.com.au
Severity|normal |critical
PATCH:
interpret.c, line 224, FuncDeclaration::interpret().
// Don't restore the value of 'this' upon function return
- if (needThis() && thisarg->op == TOKvar && istate)
+ if (needThis() && istate)
{
- VarDeclaration *thisvar = ((VarExp
*)(thisarg))->var->isVarDeclaration();
+ VarDeclaration *thisvar = findParentVar(thisarg, istate->localThis);
for (size_t i = 0; i < istate->vars.dim; i++)
{ VarDeclaration *v = (VarDeclaration *)istate->vars.data[i];
if (v == thisvar)
{ istate->vars.data[i] = NULL;
break;
}
and also add
VarDeclaration * findParentVar(Expression *e, Expression *thisval);
to the top of the file.
This fixes both test cases.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 29 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5117
Walter Bright <bugzilla digitalmars.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |bugzilla digitalmars.com
17:13:14 PST ---
I applied the patch, and the first test case now works but the second still
fails:
test.d(7): Error: assert(s.value == 1) failed
test.d(1): Error: cannot evaluate test() at compile time
test.d(1): Error: cannot evaluate test() at compile time
Perhaps your sources differ in other ways?
http://www.dsource.org/projects/dmd/changeset/742
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 07 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5117I applied the patch, and the first test case now works but the second still fails: test.d(7): Error: assert(s.value == 1) failed test.d(1): Error: cannot evaluate test() at compile time test.d(1): Error: cannot evaluate test() at compile time Perhaps your sources differ in other ways? http://www.dsource.org/projects/dmd/changeset/742Not sure what's happened here. Maybe I got the test case wrong. Regardless, this change (line 228) fixes it. // Don't restore the value of 'this' upon function return if (needThis() && istate) { VarDeclaration *thisvar = findParentVar(thisarg, istate->localThis); + if (!thisvar) // it's a reference. Find which variable it refers to. + thisvar = findParentVar(thisarg->interpret(istate), istate->localThis); for (size_t i = 0; i < istate->vars.dim; i++) { VarDeclaration *v = (VarDeclaration *)istate->vars.data[i]; -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 08 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5117
Walter Bright <bugzilla digitalmars.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |FIXED
13:38:48 PST ---
That did the trick, thanks!
http://www.dsource.org/projects/dmd/changeset/747
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 10 2010









d-bugmail puremagic.com 