http://d.puremagic.com/issues/show_bug.cgi?id=2807





------- Comment #1 from clugd...@yahoo.com.au  2009-04-22 15:07 -------
And here's a patch. This makes it safe to have nested pure functions.
A nested pure function is only permitted to access its own variables, plus
immutables and manifest constants from outer scopes.


===================================================================
--- expression.c        (revision 24)
+++ expression.c        (working copy)
@@ -3994,12 +3994,21 @@
 #if 1
        if (sc->func) {
                FuncDeclaration *outerfunc=sc->func;
+               bool hasPureParent=false;
                while (outerfunc->toParent2() &&
outerfunc->toParent2()->isFuncDeclaration()) {
+                       hasPureParent |= outerfunc->isPure();
                        outerfunc =
outerfunc->toParent2()->isFuncDeclaration();
                }
-    if (outerfunc->isPure()  && !sc->intypeof && v->isDataseg() &&
!v->isInvariant())
+               hasPureParent |= outerfunc->isPure();
+               // If ANY of its enclosing functions are pure, it cannot do
anything impure.
+               // If it is pure, it cannot access any mutable variables other
than those inside itself.
+       if (hasPureParent && !sc->intypeof && v->isDataseg() &&
!v->isInvariant()) {
                error("pure function '%s' cannot access mutable static data
'%s'", sc->func->toChars(), v->toChars());
-       }
+       } else if (sc->func->isPure() && sc->parent!=v->parent && !sc->intypeof
&& !v->isInvariant() && !(v->storage_class & STCmanifest)) {            
+                       error("pure nested function '%s' cannot access mutable
data '%s'", sc->func->toChars(), v->toChars()); 
+                  if (v->isEnumDeclaration()) error("enum");
+       }       
+       } 
 #else
        if (sc->func && sc->func->isPure() && !sc->intypeof)
        {


-- 

Reply via email to