[Issue 7554] New: Immutable function pointer arguments too

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Feb 20 14:51:50 PST 2012


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

           Summary: Immutable function pointer arguments too
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Keywords: rejects-valid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2012-02-20 14:51:48 PST ---
This problem may be correlated to Issue 7500

This code doesn't compile because 'foo' is mutable:


T outer(T)(T function(in T) pure foo) pure {
     pure int inner() {
         return foo(5);
     }
     return inner();
}
int sqr(in int x) pure {
     return x * x;
}
void main() {
     assert(outer(&sqr) == 25);
}


test.d(3): Error: pure nested function 'inner' cannot access mutable data 'foo'
test.d(11): Error: template instance test.outer!(int) error instantiating


But it doesn't work if you add an 'immutable':


T outer(T)(immutable T function(in T) pure foo) pure {
     pure int inner() {
         return foo(5);
     }
     return inner();
}
int sqr(in int x) pure {
     return x * x;
}
void main() {
     assert(outer(&sqr) == 25);
}


test.d(11): Error: template test.outer(T) cannot deduce template function from
argument types !()(int function(const(int) x) pure)



This compiles, but it's not nice:


int sqr(in int x) pure {
     return x * x;
}
immutable sqrPtr =&sqr;
auto outer(typeof(sqrPtr) foo) pure {
     pure int inner() {
         return foo(5);
     }
     return inner();
}
void main() {
     assert(outer(sqrPtr) == 25);
}



A better workaround, found by Timon Gehr:

T outer(T)(T function(in T) pure foo) pure {
     immutable fooTick = foo;
     pure int inner() {
         return fooTick(5);
     }
     return inner();
}
int sqr(in int x) pure {
     return x * x;
}
void main() {
     assert(outer(&sqr) == 25);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list