On Monday, 9 April 2018 at 03:20:58 UTC, helxi wrote:
Is std.variant.visit not @nogc?

These error messages REALLY need to be fixed.

visit, being a template, is @nogc or not based on the arguments passed to it as well as its own body, so while the error messages point to visit itself, these are frequently actually caused the predicate your pass.

....well, in this case, it is actually visit itself.

phobos/std/variant.d(2464): Error: @nogc function std.variant.visitImpl!(true, VariantN!(8u, int, string), function (string s) => printf("%s\x0a", cast(immutable(char)*)s), function (int n) => printf("%i\x0a", n)).visitImpl cannot call non-@nogc constructor std.variant.VariantException.this phobos/std/variant.d(2469): Error: @nogc function std.variant.visitImpl!(true, VariantN!(8u, int, string), function (string s) => printf("%s\x0a", cast(immutable(char)*)s), function (int n) => printf("%i\x0a", n)).visitImpl cannot call non-@nogc function std.variant.VariantN!(8u, int, string).VariantN.peek!int.peek phobos/std/variant.d(2469): Error: @nogc function std.variant.visitImpl!(true, VariantN!(8u, int, string), function (string s) => printf("%s\x0a", cast(immutable(char)*)s), function (int n) => printf("%i\x0a", n)).visitImpl cannot call non-@nogc function std.variant.VariantN!(8u, int, string).VariantN.peek!string.peek phobos/std/variant.d(2173): Error: template instance `std.variant.visitImpl!(true, VariantN!(8u, int, string), function (string s) => printf("%s\x0a", cast(immutable(char)*)s), function (int n) => printf("%i\x0a", n))` error instantiating


Ugh, so unreadable even on this level, but at least the actual information is there:

std.variant.VariantException.this is not marked @nogc (but it prolly could be)

VariantN.peek is not @nogc because it calls Object.opEquals... which is broken af, sadly, but can probably be fixed for this case by marking TypeInfo.opEquals nogc.


I think the peek one is going to be the harder one to work around since any reimplementation of peek is probably going to still call it... though MAYBE you can use `!is` instead of `!=`... and any reimplementation of visit needs to check types.


But if you wanna try to work around it, I would copy the visitImpl and visit functions out of std.variant and do some adjustments, then call your version instead (which will be fairly easy btw since they are already UFCS).



FYI: the way I got these error messages was to go into the Phobos source and add @nogc to the lowest level template in the instantiation chain. Then just recompile your program - no need to recompile Phobos itself since they are templates.

I wish the error messages would just do this for you (simulate @nogc at the second-highest level) to keep you from having to edit it yourself just to know what it is.

Reply via email to