Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
June 30, 2011 [Issue 6230] New: Member functions can no longer be weakly pure | ||||
---|---|---|---|---|
| ||||
http://d.puremagic.com/issues/show_bug.cgi?id=6230 Summary: Member functions can no longer be weakly pure Product: D Version: D2 Platform: All OS/Version: All Status: NEW Keywords: rejects-valid Severity: blocker Priority: P2 Component: DMD AssignedTo: nobody@puremagic.com ReportedBy: kennytm@gmail.com --- Comment #0 from kennytm@gmail.com 2011-06-30 08:39:36 PDT --- (See http://lists.puremagic.com/pipermail/phobos/2011-June/005487.html and comments in Phobos commit 4f28d** for existing discussion.) After DMD commit 84b4f* a member function can no longer be pure, claiming itself as a nested function. I believe this is a bug because the relevant DMD code Dsymbol *vparent = v->toParent2(); for (Dsymbol *s = sc->func; s; s = s->toParent2()) { if (s == vparent) break; FuncDeclaration *ff = s->isFuncDeclaration(); if (!ff) break; if (ff->setImpure()) { error("pure nested function '%s' cannot access mutable data '%s'", ff->toChars(), v->toChars()); break; } } cannot check the case when 'vparent' is an aggregrate. Nevertheless, this leads to commits d014a and 40def in druntime, and 4f28d in Phobos**, which probably means this bug is INVALID. Test case: ----------------------- struct S { int p; int q() const pure { // <-- Error return p; } } class C { int p; int q() const pure { // <-- Error return p; } } int q2(ref const S s) pure { // <-- Currently OK return s.p; } int q3(ref const C c) pure { // <-- Currently OK return c.p; } ----------------------- y.d(4): Error: pure nested function 'q' cannot access mutable data 'p' y.d(11): Error: pure nested function 'q' cannot access mutable data 'p' ----------------------- * https://github.com/D-Programming-Language/dmd/commit/84b4f ** https://github.com/D-Programming-Language/druntime/commit/d014a https://github.com/D-Programming-Language/druntime/commit/40def https://github.com/D-Programming-Language/phobos/commit/4f28d -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
June 30, 2011 [Issue 6230] Member functions can no longer be weakly pure | ||||
---|---|---|---|---|
| ||||
Posted in reply to kennytm@gmail.com | http://d.puremagic.com/issues/show_bug.cgi?id=6230 --- Comment #1 from kennytm@gmail.com 2011-06-30 09:50:12 PDT --- One possible patch: diff --git a/src/expression.c b/src/expression.c index 57cdd61..71f6239 100644 --- a/src/expression.c +++ b/src/expression.c @@ -1366,17 +1366,23 @@ void Expression::checkPurity(Scope *sc, VarDeclaration *v, Expression *ethis) * requiring each function in between to be impure. */ Dsymbol *vparent = v->toParent2(); - for (Dsymbol *s = sc->func; s; s = s->toParent2()) + Dsymbol *s = sc->func, *snext = s->toParent2(); + // Make sure we're really finding parent *functions*, not parent + // class. + if (vparent->isFuncDeclaration() || snext != vparent) { - if (s == vparent) - break; - FuncDeclaration *ff = s->isFuncDeclaration(); - if (!ff) - break; - if (ff->setImpure()) - { error("pure nested function '%s' cannot access mutable data '%s'", - ff->toChars(), v->toChars()); - break; + for (; s; s = s->toParent2()) + { + if (s == vparent) + break; + FuncDeclaration *ff = s->isFuncDeclaration(); + if (!ff) + break; + if (ff->setImpure()) + { error("pure nested function '%s' cannot access mutable data '%s'", + ff->toChars(), v->toChars()); + break; + } } } } diff --git a/src/func.c b/src/func.c index 9957d7f..1cccbed 100644 --- a/src/func.c +++ b/src/func.c @@ -2664,9 +2664,9 @@ enum PURE FuncDeclaration::isPure() TypeFunction *tf = (TypeFunction *)type; if (flags & FUNCFLAGpurityInprocess) setImpure(); - enum PURE purity = tf->purity; - if (purity == PUREfwdref) + if (tf->purity == PUREfwdref) tf->purityLevel(); + enum PURE purity = tf->purity; if (purity > PUREweak && needThis()) { // The attribute of the 'this' reference affects purity strength if (type->mod & (MODimmutable | MODwild)) @@ -2676,6 +2676,9 @@ enum PURE FuncDeclaration::isPure() else purity = PUREweak; } + tf->purity = purity; + // ^ This rely on the current situation that every FuncDeclaration has a + // unique TypeFunction. return purity; } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
July 04, 2011 [Issue 6230] Member functions can no longer be weakly pure | ||||
---|---|---|---|---|
| ||||
Posted in reply to kennytm@gmail.com | http://d.puremagic.com/issues/show_bug.cgi?id=6230 kennytm@gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch --- Comment #2 from kennytm@gmail.com 2011-07-04 12:25:20 PDT --- DMD pull #210. https://github.com/D-Programming-Language/dmd/pull/210 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
July 07, 2011 [Issue 6230] Member functions can no longer be weakly pure | ||||
---|---|---|---|---|
| ||||
Posted in reply to kennytm@gmail.com | http://d.puremagic.com/issues/show_bug.cgi?id=6230 Walter Bright <bugzilla@digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |bugzilla@digitalmars.com Resolution| |FIXED --- Comment #3 from Walter Bright <bugzilla@digitalmars.com> 2011-07-06 20:34:27 PDT --- https://github.com/D-Programming-Language/dmd/commit/47efdef731e2ed1333aeedc053d37adff4356585 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
August 02, 2011 [Issue 6230] Member functions can no longer be weakly pure | ||||
---|---|---|---|---|
| ||||
Posted in reply to kennytm@gmail.com | http://d.puremagic.com/issues/show_bug.cgi?id=6230 --- Comment #4 from Walter Bright <bugzilla@digitalmars.com> 2011-08-01 21:44:14 PDT --- https://github.com/D-Programming-Language/dmd/commit/1dac08b77af2826996567f629acf7f43d724cd48 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation