cast to pure function stop work after upgrade
Tejas
notrealemail at gmail.com
Mon Aug 2 11:28:46 UTC 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
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
}
```
More information about the Digitalmars-d-learn
mailing list