Bug 2256 – Function pointers do not implicitly convert to/from immutable

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2008-07-30T22:45:00Z
Last change time
2015-06-09T01:19:59Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
someanon
Depends on
3797

Comments

Comment #0 by someanon — 2008-07-30T22:45:12Z
$ dmd -c memberfunptr.d memberfunptr.d(9): Error: cannot implicitly convert expression (__funcliteral1) of type void function(A) to invariant(void function(A)) $ cat memberfunptr.d ========================================== import std.stdio; class A { void f() {writefln("f()");} void g() {writefln("g()");} } alias void function(A) FP; invariant FP mfp1 = function void(A obj) {obj.f();}; // why this doesn't work? // the following compiles, but ugly static invariant FP mfp2; static this() { mfp2 = cast(invariant FP)(function void(A obj) {obj.g();}); } ========================================== http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D&artnum=74330 Why a function literal is not a constant expression? Especially after I defining a global top level wrapper function in this case. Under the hood, it should just be a raw pointer to some memory address, why this cannot be a constant?
Comment #1 by yebblies — 2011-06-10T06:07:53Z
The 'is not a constant expression' part is covered by bug 2634. https://github.com/D-Programming-Language/dmd/pull/96 fixes the implicit conversion to immutable.
Comment #2 by yebblies — 2011-09-02T06:09:35Z
(In reply to comment #1) > The 'is not a constant expression' part is covered by bug 2634. > > https://github.com/D-Programming-Language/dmd/pull/96 > fixes the implicit conversion to immutable. https://github.com/D-Programming-Language/dmd/commit/306df8eaa6f8a987f76f401a1e03d8edf1f1e2ae Now works as bug 3797 and bug 2634 have been fixed.