import std.variant; import std.stdio; void main() { int[string] o; o["foo"] = 42; Variant a = o; Algebraic!(int[string], string) b = o; writeln(a["foo"]); writeln(b["foo"]); } The last line fails at runtime with an exception.
Hans Fugal identified this blames to revision 3a1f9109, this snippet: @@ -313,20 +364,23 @@ private: case OpID.index: auto me = cast(A*) pStore; - static if (isArray!(A)) + // Added allowed!(...) prompted by a bug report by Chris + // Nicholson-Sauls. + static if (isArray!(A) && allowed!(typeof(A.init[0]))) { // array type; input and output are the same VariantN auto result = cast(VariantN*) parm; size_t index = result.convertsTo!(int) ? result.get!(int) : result.get!(size_t); *result = (*me)[index]; - break; + break; } - else static if (isAssociativeArray!(A)) + else static if (isAssociativeArray!(A) + && allowed!(typeof(A.init.values[0]))) { auto result = cast(VariantN*) parm; *result = (*me)[result.get!(typeof(A.keys[0]))]; - break; + break; } else {
*** Issue 13354 has been marked as a duplicate of this issue. ***
a dup of this one is resolved fixed.