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: ---