From 5a64b47d10087fa15c110d4f8a79ac035813f8ac Mon Sep 17 00:00:00 2001 From: Andrei Alexandrescu Date: Sun, 26 Sep 2010 04:35:12 +0000 Subject: [PATCH] Fix for Bugzilla 2073 --- std/traits.d | 7 +++++++ std/variant.d | 34 +++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/std/traits.d b/std/traits.d index e51bb501d..5702a59b2 100644 --- a/std/traits.d +++ b/std/traits.d @@ -2127,6 +2127,13 @@ template ImplicitConversionTargets(T) ImplicitConversionTargets; else static if(is(T : Object)) alias TransitiveBaseTypeTuple!(T) ImplicitConversionTargets; + // @@@BUG@@@ this should work + // else static if (isDynamicArray!T && !is(typeof(T.init[0]) == const)) + // alias TypeTuple!(const(typeof(T.init[0]))[]) ImplicitConversionTargets; + else static if (is(T == char[])) + alias TypeTuple!(const(char)[]) ImplicitConversionTargets; + else static if (isDynamicArray!T && !is(typeof(T.init[0]) == const)) + alias TypeTuple!(const(typeof(T.init[0]))[]) ImplicitConversionTargets; else static if (is(T : void*)) alias TypeTuple!(void*) ImplicitConversionTargets; else diff --git a/std/variant.d b/std/variant.d index 7f1e3a74c..6b7ff5f41 100644 --- a/std/variant.d +++ b/std/variant.d @@ -64,11 +64,11 @@ */ module std.variant; -import std.traits, std.c.string, std.typetuple, std.conv; -version(unittest) -{ +import std.traits, std.c.string, std.typetuple, std.conv, std.exception; +// version(unittest) +// { import std.exception, std.stdio; -} +//} private template maxSize(T...) { @@ -251,7 +251,7 @@ private: // by the incoming TypeInfo static bool tryPutting(A* src, TypeInfo targetType, void* target) { - alias TypeTuple!(A, ImplicitConversionTargets!(A)) AllTypes; + alias TypeTuple!(A, ImplicitConversionTargets!A) AllTypes; foreach (T ; AllTypes) { if (targetType != typeid(T) && @@ -663,8 +663,21 @@ public: { static if (isNumeric!(T)) { - // maybe optimize this fella; handle ints separately - return to!(T)(get!(real)); + if (convertsTo!real()) + { + // maybe optimize this fella; handle ints separately + return to!T(get!real); + } + else if (convertsTo!(const(char)[])) + { + return to!T(get!(const(char)[])); + } + else + { + enforce(false, text("Type ", type(), " does not convert to ", + typeid(T))); + assert(0); + } } else static if (is(T : Object)) { @@ -1396,3 +1409,10 @@ unittest } assert(j == 4); } + +// test convertibility +unittest +{ + auto v = Variant("abc".dup); + assert(v.convertsTo!(char[])); +}