digitalmars.D.learn - cast to pure function stop work after upgrade
- baby_tiger (30/30) Jun 14 2021 this used work for me, after upgrade I get this error. how to
this used work for me, after upgrade I get this error. how to fix it ? import std.traits; enum LogLevel : ubyte { INFO = 0, WARN, ERROR, FATAL, } extern (C) string VFORMAT(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow { return null; } template asPure(string P, alias Fn) if (isFunctionPointer!(typeof(&Fn))) { enum N = __traits(identifier, Fn); enum string asPure = "private alias " ~ N ~ "_PURE = " ~ typeof(&Fn).stringof ~ " pure;\n" ~ "__gshared immutable " ~ N ~ "_PURE " ~ P ~"= cast(" ~ N ~ "_PURE) &" ~ N ~ " ;" ; } enum xx = asPure!("VFORMATP", VFORMAT); mixin(xx); void main(){ } reinterpreting cast from `nothrow nogc extern (C) string(LogLevel level, string file, ulong line, char[] tmp, bool line_break, string tag, string fmt, ...)*` to `pure nothrow nogc extern (C) string(LogLevel, string, ulong, char[], bool, string, string, ...)*` is not supported in CTFE
Jun 14 2021
On Monday, 14 June 2021 at 13:31:51 UTC, baby_tiger wrote:this used work for me, after upgrade I get this error. how to fix it ? import std.traits; enum LogLevel : ubyte { INFO = 0, WARN, ERROR, FATAL, } extern (C) string VFORMAT(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow { return null; } template asPure(string P, alias Fn) if (isFunctionPointer!(typeof(&Fn))) { enum N = __traits(identifier, Fn); enum string asPure = "private alias " ~ N ~ "_PURE = " ~ typeof(&Fn).stringof ~ " pure;\n" ~ "__gshared immutable " ~ N ~ "_PURE " ~ P ~"= cast(" ~ N ~ "_PURE) &" ~ N ~ " ;" ; } enum xx = asPure!("VFORMATP", VFORMAT); mixin(xx); void main(){ } reinterpreting cast from `nothrow nogc extern (C) string(LogLevel level, string file, ulong line, char[] tmp, bool line_break, string tag, string fmt, ...)*` to `pure nothrow nogc extern (C) string(LogLevel, string, ulong, char[], bool, string, string, ...)*` is not supported in CTFEIt seems to not work at runtime either. Maybe they've made this behaviour illegal now? Hopefully someone answers. ```d import std.traits; import core.stdc.stdarg; enum LogLevel : ubyte { INFO = 0, WARN, ERROR, FATAL, } extern (C) string VFORMAT(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow { return null; } extern (C) string function(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow pure fp; void main(){ fp = &VFORMAT; //fails } ```
Aug 02 2021
On Monday, 2 August 2021 at 11:28:46 UTC, Tejas wrote:On Monday, 14 June 2021 at 13:31:51 UTC, baby_tiger wrote:Try this: ```d void main(){ fp = cast(typeof(fp))&VFORMAT; //fails } ```[...]It seems to not work at runtime either. Maybe they've made this behaviour illegal now? Hopefully someone answers. ```d import std.traits; import core.stdc.stdarg; enum LogLevel : ubyte { INFO = 0, WARN, ERROR, FATAL, } extern (C) string VFORMAT(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow { return null; } extern (C) string function(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow pure fp; void main(){ fp = &VFORMAT; //fails } ```
Aug 02 2021
On Monday, 2 August 2021 at 15:10:06 UTC, vit wrote:On Monday, 2 August 2021 at 11:28:46 UTC, Tejas wrote:Agh, stupid me. You the man!![...]Try this: ```d void main(){ fp = cast(typeof(fp))&VFORMAT; //fails } ```
Aug 02 2021
On Monday, 14 June 2021 at 13:31:51 UTC, baby_tiger wrote:this used work for me, after upgrade I get this error. how to fix it ? import std.traits; enum LogLevel : ubyte { INFO = 0, WARN, ERROR, FATAL, } extern (C) string VFORMAT(LogLevel level, string file, size_t line, char[] tmp, bool line_break, string tag, string fmt, ...) nogc nothrow { return null; } template asPure(string P, alias Fn) if (isFunctionPointer!(typeof(&Fn))) { enum N = __traits(identifier, Fn); enum string asPure = "private alias " ~ N ~ "_PURE = " ~ typeof(&Fn).stringof ~ " pure;\n" ~ "__gshared immutable " ~ N ~ "_PURE " ~ P ~"= cast(" ~ N ~ "_PURE) &" ~ N ~ " ;" ; } enum xx = asPure!("VFORMATP", VFORMAT); mixin(xx); void main(){ } reinterpreting cast from `nothrow nogc extern (C) string(LogLevel level, string file, ulong line, char[] tmp, bool line_break, string tag, string fmt, ...)*` to `pure nothrow nogc extern (C) string(LogLevel, string, ulong, char[], bool, string, string, ...)*` is not supported in CTFE```d int foo(int x) safe{ return x; } /* This is valid. safe CTFE cast, systemFoo has less restrictive function type. */ auto systemFoo = cast(int function(int) system)&foo; /* ERROR UNSAFE CTFE cast, pureFoo has more restrictive function type. */ //auto pureFoo = cast(void function(int)pure)&foo; int function(int)pure pureFoo; shared static this(){ /* This is valid. UNSAFE RUNTIME cast. */ pureFoo = cast(int function(int)pure)&foo; } void main(){ assert(pureFoo(42) == 42); } ```
Aug 02 2021