digitalmars.D.bugs - [Issue 7554] New: Immutable function pointer arguments too
- d-bugmail puremagic.com (76/76) Feb 20 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (19/19) Feb 26 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (7/8) Feb 26 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (32/32) Feb 27 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (15/15) Feb 27 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (10/10) Feb 27 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (12/12) Feb 28 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
- d-bugmail puremagic.com (10/10) Feb 28 2012 http://d.puremagic.com/issues/show_bug.cgi?id=7554
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 puremagic.com
ReportedBy: bearophile_hugs eml.cc
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: -------
Feb 20 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554
I think making inner() pure isn't necessary.
Following raises no error and works as expected.
T outer(T)(T function(in T) pure foo) pure {
int inner() {
return foo(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: -------
Feb 26 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554I think making inner() pure isn't necessary.In this program I want inner() to be pure. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 26 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554
This code compiles, but I don't remember if this used to compile even before
fixing bug 7500 :
int outer(immutable int function(in int) 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);
}
This doesn't compile still:
T outer(T)(immutable T function(T) pure foo) pure {
pure int inner() {
return foo(5);
}
return inner();
}
int sqr(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: -------
Feb 27 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554
OK. Reduced test case.
int sqr(int x) pure {
return x * x;
}
void main()
{
immutable(int function(int) pure) ifp = &sqr;
// Error: cannot implicitly convert expression (& sqr) of type int
function(int x) pure to immutable(int function(int) pure)
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 27 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554
Kenji Hara <k.hara.pg gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |pull
https://github.com/D-Programming-Language/dmd/pull/772
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 27 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554 Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/c1906e09d7b773bc5ff0a2477b3139c98d8e60ea fix Issue 7554 - Immutable function pointer arguments too Protect function type from inappropriate modifier transition. https://github.com/D-Programming-Language/dmd/commit/461649be7975faf119188674f296a7fac7c38a96 Issue 7554 - Immutable function pointer arguments too -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 28 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7554
Walter Bright <bugzilla digitalmars.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
CC| |bugzilla digitalmars.com
Resolution| |FIXED
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 28 2012









d-bugmail puremagic.com 