]> Pileus Git - ~andy/sunrise/blob - dev-lang/dmd/files/2.059-issue-7907.patch
e04d226e16bc593b3993e8adcd61591268137be9
[~andy/sunrise] / dev-lang / dmd / files / 2.059-issue-7907.patch
1 diff -Nurp a/src/phobos/std/conv.d b/src/phobos/std/conv.d
2 --- a/src/phobos/std/conv.d     2012-04-17 12:02:10.824875716 +0200
3 +++ b/src/phobos/std/conv.d     2012-04-17 12:15:10.654126508 +0200
4 @@ -101,6 +101,12 @@ private
5          formatValue(w, src, f);
6          return w.data;
7      }
8 +
9 +    template isEnumStrToStr(S, T)   // @@@Workaround@@@
10 +    {
11 +        enum isEnumStrToStr = isImplicitlyConvertible!(S, T) &&
12 +                              is(S == enum) && isSomeString!T;
13 +    }
14  }
15  
16  /**
17 @@ -250,7 +256,7 @@ If the source type is implicitly convert
18  to) simply performs the implicit conversion.
19   */
20  T toImpl(T, S)(S value)
21 -    if (isImplicitlyConvertible!(S, T))
22 +    if (isImplicitlyConvertible!(S, T) && !isEnumStrToStr!(S, T))
23  {
24      alias isUnsigned isUnsignedInt;
25  
26 @@ -1032,8 +1038,7 @@ unittest
27  
28  /// ditto
29  T toImpl(T, S)(S s)
30 -    if (!isImplicitlyConvertible!(S, T) &&
31 -        is(S == enum) &&
32 +    if (is(S == enum) &&
33          isSomeString!T)
34  {
35      return toStr!T(s);
36 @@ -1042,21 +1047,26 @@ T toImpl(T, S)(S s)
37  unittest
38  {
39      debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
40 -    enum E { a, b, c }
41 -    assert(to! string(E.a) == "a"c);
42 -    assert(to!wstring(E.b) == "b"w);
43 -    assert(to!dstring(E.c) == "c"d);
44 -
45 -    enum F : real { x = 1.414, y = 1.732, z = 2.236 }
46 -    assert(to! string(F.x) == "x"c);
47 -    assert(to!wstring(F.y) == "y"w);
48 -    assert(to!dstring(F.z) == "z"d);
49 +
50 +    enum EB { a = true }
51 +    enum EU { a = 0, b = 1, c = 2 }     // base type is unsigned
52 +    enum EI { a = -1, b = 0, c = 1 }    // base type is signed (bug 7909)
53 +    enum EF : real { a = 1.414, b = 1.732, c = 2.236 }
54 +    enum EC { a = 'a', b = 'b' }
55 +    enum ES : string { a = "aaa", b = "bbb" }
56 +
57 +    foreach (E; TypeTuple!(EB, EU, EI, EF, EC, ES))
58 +    {
59 +        assert(to! string(E.a) == "a"c);
60 +        assert(to!wstring(E.a) == "a"w);
61 +        assert(to!dstring(E.a) == "a"d);
62 +    }
63  
64      // Test an value not corresponding to an enum member.
65 -    auto o = cast(E)5;
66 -    assert(to! string(o) == "cast(E)5"c);
67 -    assert(to!wstring(o) == "cast(E)5"w);
68 -    assert(to!dstring(o) == "cast(E)5"d);
69 +    auto o = cast(EU)5;
70 +    assert(to! string(o) == "cast(EU)5"c);
71 +    assert(to!wstring(o) == "cast(EU)5"w);
72 +    assert(to!dstring(o) == "cast(EU)5"d);
73  }
74  
75  /// ditto
76 @@ -1073,7 +1083,7 @@ deprecated T toImpl(T, S)(S s, in T left
77  
78  /// ditto
79  T toImpl(T, S)(S b)
80 -    if (is(Unqual!S == bool) &&
81 +    if (isBoolean!S &&
82          isSomeString!T)
83  {
84      return toStr!T(b);
85 @@ -1090,7 +1100,7 @@ unittest
86  
87  /// ditto
88  T toImpl(T, S)(S c)
89 -    if (isSomeChar!(Unqual!S) &&
90 +    if (isSomeChar!S &&
91          isSomeString!T)
92  {
93      return toStr!T(c);
94 @@ -1132,7 +1142,7 @@ unittest
95  
96  /// ditto
97  T toImpl(T, S)(S input)
98 -    if (isIntegral!S && isUnsigned!S &&
99 +    if (isIntegral!S &&
100          isSomeString!T)
101  {
102      return toStr!T(input);
103 @@ -1149,26 +1159,7 @@ unittest
104          assert(to!string(to!Int(9)) == "9");
105          assert(to!string(to!Int(123)) == "123");
106      }
107 -}
108 -
109 -/// ditto
110 -T toImpl(T, S)(S value)
111 -    if (isIntegral!S && isSigned!S &&
112 -        isSomeString!T)
113 -{
114 -    return toStr!T(value);
115 -}
116  
117 -unittest
118 -{
119 -    debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
120 -    assert(wtext(int.max) == "2147483647"w);
121 -    assert(wtext(int.min) == "-2147483648"w);
122 -    assert(to!string(0L) == "0");
123 -}
124 -
125 -unittest
126 -{
127      foreach (Int; TypeTuple!(byte, short, int, long))
128      {
129          debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
130 @@ -1184,9 +1175,17 @@ unittest
131      }
132  }
133  
134 +unittest
135 +{
136 +    debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
137 +    assert(wtext(int.max) == "2147483647"w);
138 +    assert(wtext(int.min) == "-2147483648"w);
139 +    assert(to!string(0L) == "0");
140 +}
141 +
142  /// ditto
143  T toImpl(T, S)(S value, uint radix)
144 -    if (isIntegral!(Unqual!S) &&
145 +    if (isIntegral!S &&
146          isSomeString!T)
147  in
148  {
149 @@ -1194,7 +1193,7 @@ in
150  }
151  body
152  {
153 -    static if (!is(Unqual!S == ulong))
154 +    static if (!is(IntegralTypeOf!S == ulong))
155      {
156          enforce(radix >= 2 && radix <= 36, new ConvException("Radix error"));
157          if (radix == 10)
158 @@ -2076,24 +2075,25 @@ Target parse(Target, Source)(ref Source
159          ~ to!string(s) ~ "'");
160  }
161  
162 -//@@@BUG4737@@@: typeid doesn't work for scoped enum with initializer
163 -version(unittest)
164 -{
165 -    private enum F : real { x = 1.414, y = 1.732, z = 2.236 }
166 -}
167  unittest
168  {
169      debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, " succeeded.");
170 -    enum E { a, b, c }
171 -    assert(to!E("a"c) == E.a);
172 -    assert(to!E("b"w) == E.b);
173 -    assert(to!E("c"d) == E.c);
174  
175 -    assert(to!F("x"c) == F.x);
176 -    assert(to!F("y"w) == F.y);
177 -    assert(to!F("z"d) == F.z);
178 +    enum EB : bool { a = true, b = false, c = a }
179 +    enum EU { a, b, c }
180 +    enum EI { a = -1, b = 0, c = 1 }
181 +    enum EF : real { a = 1.414, b = 1.732, c = 2.236 }
182 +    enum EC : char { a = 'a', b = 'b', c = 'c' }
183 +    enum ES : string { a = "aaa", b = "bbb", c = "ccc" }
184 +
185 +    foreach (E; TypeTuple!(EB, EU, EI, EF, EC, ES))
186 +    {
187 +        assert(to!E("a"c) == E.a);
188 +        assert(to!E("b"w) == E.b);
189 +        assert(to!E("c"d) == E.c);
190  
191 -    assertThrown!ConvException(to!E("d"));
192 +        assertThrown!ConvException(to!E("d"));
193 +    }
194  }
195  
196  version (none)  // TODO: BUG4744
197 diff -Nurp a/src/phobos/std/stdio.d b/src/phobos/std/stdio.d
198 --- a/src/phobos/std/stdio.d    2012-04-17 12:02:10.957874054 +0200
199 +++ b/src/phobos/std/stdio.d    2012-04-17 12:15:10.648126586 +0200
200 @@ -665,19 +665,19 @@ arguments in text format to the file. */
201          foreach (arg; args)
202          {
203              alias typeof(arg) A;
204 -            static if (isSomeString!A && !is(A == enum))
205 +            static if (isSomeString!A)
206              {
207                  put(w, arg);
208              }
209 -            else static if (isIntegral!A && !is(A == enum))
210 +            else static if (isIntegral!A)
211              {
212                  toTextRange(arg, w);
213              }
214 -            else static if (isBoolean!A && !is(A == enum))
215 +            else static if (isBoolean!A)
216              {
217                  put(w, arg ? "true" : "false");
218              }
219 -            else static if (isSomeChar!A && !is(A == enum))
220 +            else static if (isSomeChar!A)
221              {
222                  put(w, arg);
223              }
224 diff -Nurp a/src/phobos/std/traits.d b/src/phobos/std/traits.d
225 --- a/src/phobos/std/traits.d   2012-04-17 12:02:10.897874804 +0200
226 +++ b/src/phobos/std/traits.d   2012-04-17 12:15:10.647126599 +0200
227 @@ -2693,7 +2693,7 @@ unittest
228  
229  /*
230   */
231 -template BooleanTypeOf(T)
232 +template BooleanTypeOf(T) if (!is(T == enum))
233  {
234             inout(bool) idx(        inout(bool) );
235      shared(inout bool) idx( shared(inout bool) );
236 @@ -2727,7 +2727,7 @@ unittest
237  
238  /*
239   */
240 -template IntegralTypeOf(T)
241 +template IntegralTypeOf(T) if (!is(T == enum))
242  {
243             inout(  byte) idx(        inout(  byte) );
244             inout( ubyte) idx(        inout( ubyte) );
245 @@ -2786,7 +2786,7 @@ unittest
246  
247  /*
248   */
249 -template FloatingPointTypeOf(T)
250 +template FloatingPointTypeOf(T) if (!is(T == enum))
251  {
252             inout( float) idx(        inout( float) );
253             inout(double) idx(        inout(double) );
254 @@ -2825,7 +2825,7 @@ unittest
255  
256  /*
257   */
258 -template NumericTypeOf(T)
259 +template NumericTypeOf(T) if (!is(T == enum))
260  {
261      static if (is(IntegralTypeOf!T X))
262          alias X NumericTypeOf;
263 @@ -2853,7 +2853,7 @@ unittest
264  
265  /*
266   */
267 -template UnsignedTypeOf(T)
268 +template UnsignedTypeOf(T) if (!is(T == enum))
269  {
270      static if (is(IntegralTypeOf!T X) &&
271                 staticIndexOf!(Unqual!X, UnsignedIntTypeList) >= 0)
272 @@ -2862,7 +2862,7 @@ template UnsignedTypeOf(T)
273          static assert(0, T.stringof~" is not an unsigned type.");
274  }
275  
276 -template SignedTypeOf(T)
277 +template SignedTypeOf(T) if (!is(T == enum))
278  {
279      static if (is(IntegralTypeOf!T X) &&
280                 staticIndexOf!(Unqual!X, SignedIntTypeList) >= 0)
281 @@ -2875,7 +2875,7 @@ template SignedTypeOf(T)
282  
283  /*
284   */
285 -template CharTypeOf(T)
286 +template CharTypeOf(T) if (!is(T == enum))
287  {
288             inout( char) idx(        inout( char) );
289             inout(wchar) idx(        inout(wchar) );
290 @@ -2930,7 +2930,7 @@ unittest
291  
292  /*
293   */
294 -template StaticArrayTypeOf(T)
295 +template StaticArrayTypeOf(T) if (!is(T == enum))
296  {
297      inout(U[n]) idx(U, size_t n)( inout(U[n]) );
298  
299 @@ -2961,7 +2961,7 @@ unittest
300  
301  /*
302   */
303 -template DynamicArrayTypeOf(T)
304 +template DynamicArrayTypeOf(T) if (!is(T == enum))
305  {
306      inout(U[]) idx(U)( inout(U[]) );
307  
308 @@ -3001,7 +3001,7 @@ unittest
309  
310  /*
311   */
312 -template ArrayTypeOf(T)
313 +template ArrayTypeOf(T) if (!is(T == enum))
314  {
315      static if (is(StaticArrayTypeOf!T X))
316          alias X ArrayTypeOf;
317 @@ -3017,7 +3017,7 @@ unittest
318  
319  /*
320   */
321 -template StringTypeOf(T) if (isSomeString!T)
322 +template StringTypeOf(T) if (!is(T == enum) && isSomeString!T)
323  {
324      alias ArrayTypeOf!T StringTypeOf;
325  }
326 @@ -3047,7 +3047,7 @@ unittest
327  
328  /*
329   */
330 -template AssocArrayTypeOf(T)
331 +template AssocArrayTypeOf(T) if (!is(T == enum))
332  {
333         immutable(V [K]) idx(K, V)(    immutable(V [K]) );
334  
335 @@ -3279,7 +3279,10 @@ Detect whether we can treat T as one of
336   */
337  template isSomeString(T)
338  {
339 -    enum isSomeString = isNarrowString!T || is(T : const(dchar[]));
340 +    static if (is(T == enum))
341 +        enum isSomeString = false;
342 +    else
343 +        enum isSomeString = isNarrowString!T || is(T : const(dchar[]));
344  }
345  
346  unittest