[Issue 6230] Member functions can no longer be weakly pure

2011-08-01 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6230



--- Comment #4 from Walter Bright  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: ---


[Issue 6230] Member functions can no longer be weakly pure

2011-07-06 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6230


Walter Bright  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 CC||bugzi...@digitalmars.com
 Resolution||FIXED


--- Comment #3 from Walter Bright  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: ---


[Issue 6230] Member functions can no longer be weakly pure

2011-07-04 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6230


kenn...@gmail.com changed:

   What|Removed |Added

   Keywords||patch


--- Comment #2 from kenn...@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: ---


[Issue 6230] Member functions can no longer be weakly pure

2011-06-30 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=6230



--- Comment #1 from kenn...@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: ---