summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-lang/dmd/files/2.059-issue-7907.patch')
-rw-r--r--dev-lang/dmd/files/2.059-issue-7907.patch346
1 files changed, 346 insertions, 0 deletions
diff --git a/dev-lang/dmd/files/2.059-issue-7907.patch b/dev-lang/dmd/files/2.059-issue-7907.patch
new file mode 100644
index 000000000..e04d226e1
--- /dev/null
+++ b/dev-lang/dmd/files/2.059-issue-7907.patch
@@ -0,0 +1,346 @@
+diff -Nurp a/src/phobos/std/conv.d b/src/phobos/std/conv.d
+--- a/src/phobos/std/conv.d 2012-04-17 12:02:10.824875716 +0200
++++ b/src/phobos/std/conv.d 2012-04-17 12:15:10.654126508 +0200
+@@ -101,6 +101,12 @@ private
+ formatValue(w, src, f);
+ return w.data;
+ }
++
++ template isEnumStrToStr(S, T) // @@@Workaround@@@
++ {
++ enum isEnumStrToStr = isImplicitlyConvertible!(S, T) &&
++ is(S == enum) && isSomeString!T;
++ }
+ }
+
+ /**
+@@ -250,7 +256,7 @@ If the source type is implicitly convert
+ to) simply performs the implicit conversion.
+ */
+ T toImpl(T, S)(S value)
+- if (isImplicitlyConvertible!(S, T))
++ if (isImplicitlyConvertible!(S, T) && !isEnumStrToStr!(S, T))
+ {
+ alias isUnsigned isUnsignedInt;
+
+@@ -1032,8 +1038,7 @@ unittest
+
+ /// ditto
+ T toImpl(T, S)(S s)
+- if (!isImplicitlyConvertible!(S, T) &&
+- is(S == enum) &&
++ if (is(S == enum) &&
+ isSomeString!T)
+ {
+ return toStr!T(s);
+@@ -1042,21 +1047,26 @@ T toImpl(T, S)(S s)
+ unittest
+ {
+ debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
+- enum E { a, b, c }
+- assert(to! string(E.a) == "a"c);
+- assert(to!wstring(E.b) == "b"w);
+- assert(to!dstring(E.c) == "c"d);
+-
+- enum F : real { x = 1.414, y = 1.732, z = 2.236 }
+- assert(to! string(F.x) == "x"c);
+- assert(to!wstring(F.y) == "y"w);
+- assert(to!dstring(F.z) == "z"d);
++
++ enum EB { a = true }
++ enum EU { a = 0, b = 1, c = 2 } // base type is unsigned
++ enum EI { a = -1, b = 0, c = 1 } // base type is signed (bug 7909)
++ enum EF : real { a = 1.414, b = 1.732, c = 2.236 }
++ enum EC { a = 'a', b = 'b' }
++ enum ES : string { a = "aaa", b = "bbb" }
++
++ foreach (E; TypeTuple!(EB, EU, EI, EF, EC, ES))
++ {
++ assert(to! string(E.a) == "a"c);
++ assert(to!wstring(E.a) == "a"w);
++ assert(to!dstring(E.a) == "a"d);
++ }
+
+ // Test an value not corresponding to an enum member.
+- auto o = cast(E)5;
+- assert(to! string(o) == "cast(E)5"c);
+- assert(to!wstring(o) == "cast(E)5"w);
+- assert(to!dstring(o) == "cast(E)5"d);
++ auto o = cast(EU)5;
++ assert(to! string(o) == "cast(EU)5"c);
++ assert(to!wstring(o) == "cast(EU)5"w);
++ assert(to!dstring(o) == "cast(EU)5"d);
+ }
+
+ /// ditto
+@@ -1073,7 +1083,7 @@ deprecated T toImpl(T, S)(S s, in T left
+
+ /// ditto
+ T toImpl(T, S)(S b)
+- if (is(Unqual!S == bool) &&
++ if (isBoolean!S &&
+ isSomeString!T)
+ {
+ return toStr!T(b);
+@@ -1090,7 +1100,7 @@ unittest
+
+ /// ditto
+ T toImpl(T, S)(S c)
+- if (isSomeChar!(Unqual!S) &&
++ if (isSomeChar!S &&
+ isSomeString!T)
+ {
+ return toStr!T(c);
+@@ -1132,7 +1142,7 @@ unittest
+
+ /// ditto
+ T toImpl(T, S)(S input)
+- if (isIntegral!S && isUnsigned!S &&
++ if (isIntegral!S &&
+ isSomeString!T)
+ {
+ return toStr!T(input);
+@@ -1149,26 +1159,7 @@ unittest
+ assert(to!string(to!Int(9)) == "9");
+ assert(to!string(to!Int(123)) == "123");
+ }
+-}
+-
+-/// ditto
+-T toImpl(T, S)(S value)
+- if (isIntegral!S && isSigned!S &&
+- isSomeString!T)
+-{
+- return toStr!T(value);
+-}
+
+-unittest
+-{
+- debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
+- assert(wtext(int.max) == "2147483647"w);
+- assert(wtext(int.min) == "-2147483648"w);
+- assert(to!string(0L) == "0");
+-}
+-
+-unittest
+-{
+ foreach (Int; TypeTuple!(byte, short, int, long))
+ {
+ debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
+@@ -1184,9 +1175,17 @@ unittest
+ }
+ }
+
++unittest
++{
++ debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
++ assert(wtext(int.max) == "2147483647"w);
++ assert(wtext(int.min) == "-2147483648"w);
++ assert(to!string(0L) == "0");
++}
++
+ /// ditto
+ T toImpl(T, S)(S value, uint radix)
+- if (isIntegral!(Unqual!S) &&
++ if (isIntegral!S &&
+ isSomeString!T)
+ in
+ {
+@@ -1194,7 +1193,7 @@ in
+ }
+ body
+ {
+- static if (!is(Unqual!S == ulong))
++ static if (!is(IntegralTypeOf!S == ulong))
+ {
+ enforce(radix >= 2 && radix <= 36, new ConvException("Radix error"));
+ if (radix == 10)
+@@ -2076,24 +2075,25 @@ Target parse(Target, Source)(ref Source
+ ~ to!string(s) ~ "'");
+ }
+
+-//@@@BUG4737@@@: typeid doesn't work for scoped enum with initializer
+-version(unittest)
+-{
+- private enum F : real { x = 1.414, y = 1.732, z = 2.236 }
+-}
+ unittest
+ {
+ debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
+- enum E { a, b, c }
+- assert(to!E("a"c) == E.a);
+- assert(to!E("b"w) == E.b);
+- assert(to!E("c"d) == E.c);
+
+- assert(to!F("x"c) == F.x);
+- assert(to!F("y"w) == F.y);
+- assert(to!F("z"d) == F.z);
++ enum EB : bool { a = true, b = false, c = a }
++ enum EU { a, b, c }
++ enum EI { a = -1, b = 0, c = 1 }
++ enum EF : real { a = 1.414, b = 1.732, c = 2.236 }
++ enum EC : char { a = 'a', b = 'b', c = 'c' }
++ enum ES : string { a = "aaa", b = "bbb", c = "ccc" }
++
++ foreach (E; TypeTuple!(EB, EU, EI, EF, EC, ES))
++ {
++ assert(to!E("a"c) == E.a);
++ assert(to!E("b"w) == E.b);
++ assert(to!E("c"d) == E.c);
+
+- assertThrown!ConvException(to!E("d"));
++ assertThrown!ConvException(to!E("d"));
++ }
+ }
+
+ version (none) // TODO: BUG4744
+diff -Nurp a/src/phobos/std/stdio.d b/src/phobos/std/stdio.d
+--- a/src/phobos/std/stdio.d 2012-04-17 12:02:10.957874054 +0200
++++ b/src/phobos/std/stdio.d 2012-04-17 12:15:10.648126586 +0200
+@@ -665,19 +665,19 @@ arguments in text format to the file. */
+ foreach (arg; args)
+ {
+ alias typeof(arg) A;
+- static if (isSomeString!A && !is(A == enum))
++ static if (isSomeString!A)
+ {
+ put(w, arg);
+ }
+- else static if (isIntegral!A && !is(A == enum))
++ else static if (isIntegral!A)
+ {
+ toTextRange(arg, w);
+ }
+- else static if (isBoolean!A && !is(A == enum))
++ else static if (isBoolean!A)
+ {
+ put(w, arg ? "true" : "false");
+ }
+- else static if (isSomeChar!A && !is(A == enum))
++ else static if (isSomeChar!A)
+ {
+ put(w, arg);
+ }
+diff -Nurp a/src/phobos/std/traits.d b/src/phobos/std/traits.d
+--- a/src/phobos/std/traits.d 2012-04-17 12:02:10.897874804 +0200
++++ b/src/phobos/std/traits.d 2012-04-17 12:15:10.647126599 +0200
+@@ -2693,7 +2693,7 @@ unittest
+
+ /*
+ */
+-template BooleanTypeOf(T)
++template BooleanTypeOf(T) if (!is(T == enum))
+ {
+ inout(bool) idx( inout(bool) );
+ shared(inout bool) idx( shared(inout bool) );
+@@ -2727,7 +2727,7 @@ unittest
+
+ /*
+ */
+-template IntegralTypeOf(T)
++template IntegralTypeOf(T) if (!is(T == enum))
+ {
+ inout( byte) idx( inout( byte) );
+ inout( ubyte) idx( inout( ubyte) );
+@@ -2786,7 +2786,7 @@ unittest
+
+ /*
+ */
+-template FloatingPointTypeOf(T)
++template FloatingPointTypeOf(T) if (!is(T == enum))
+ {
+ inout( float) idx( inout( float) );
+ inout(double) idx( inout(double) );
+@@ -2825,7 +2825,7 @@ unittest
+
+ /*
+ */
+-template NumericTypeOf(T)
++template NumericTypeOf(T) if (!is(T == enum))
+ {
+ static if (is(IntegralTypeOf!T X))
+ alias X NumericTypeOf;
+@@ -2853,7 +2853,7 @@ unittest
+
+ /*
+ */
+-template UnsignedTypeOf(T)
++template UnsignedTypeOf(T) if (!is(T == enum))
+ {
+ static if (is(IntegralTypeOf!T X) &&
+ staticIndexOf!(Unqual!X, UnsignedIntTypeList) >= 0)
+@@ -2862,7 +2862,7 @@ template UnsignedTypeOf(T)
+ static assert(0, T.stringof~" is not an unsigned type.");
+ }
+
+-template SignedTypeOf(T)
++template SignedTypeOf(T) if (!is(T == enum))
+ {
+ static if (is(IntegralTypeOf!T X) &&
+ staticIndexOf!(Unqual!X, SignedIntTypeList) >= 0)
+@@ -2875,7 +2875,7 @@ template SignedTypeOf(T)
+
+ /*
+ */
+-template CharTypeOf(T)
++template CharTypeOf(T) if (!is(T == enum))
+ {
+ inout( char) idx( inout( char) );
+ inout(wchar) idx( inout(wchar) );
+@@ -2930,7 +2930,7 @@ unittest
+
+ /*
+ */
+-template StaticArrayTypeOf(T)
++template StaticArrayTypeOf(T) if (!is(T == enum))
+ {
+ inout(U[n]) idx(U, size_t n)( inout(U[n]) );
+
+@@ -2961,7 +2961,7 @@ unittest
+
+ /*
+ */
+-template DynamicArrayTypeOf(T)
++template DynamicArrayTypeOf(T) if (!is(T == enum))
+ {
+ inout(U[]) idx(U)( inout(U[]) );
+
+@@ -3001,7 +3001,7 @@ unittest
+
+ /*
+ */
+-template ArrayTypeOf(T)
++template ArrayTypeOf(T) if (!is(T == enum))
+ {
+ static if (is(StaticArrayTypeOf!T X))
+ alias X ArrayTypeOf;
+@@ -3017,7 +3017,7 @@ unittest
+
+ /*
+ */
+-template StringTypeOf(T) if (isSomeString!T)
++template StringTypeOf(T) if (!is(T == enum) && isSomeString!T)
+ {
+ alias ArrayTypeOf!T StringTypeOf;
+ }
+@@ -3047,7 +3047,7 @@ unittest
+
+ /*
+ */
+-template AssocArrayTypeOf(T)
++template AssocArrayTypeOf(T) if (!is(T == enum))
+ {
+ immutable(V [K]) idx(K, V)( immutable(V [K]) );
+
+@@ -3279,7 +3279,10 @@ Detect whether we can treat T as one of
+ */
+ template isSomeString(T)
+ {
+- enum isSomeString = isNarrowString!T || is(T : const(dchar[]));
++ static if (is(T == enum))
++ enum isSomeString = false;
++ else
++ enum isSomeString = isNarrowString!T || is(T : const(dchar[]));
+ }
+
+ unittest