Bug 5163: meaningless error message with front() applied to void[]

It's not possible to index into void[] arrays, which means that they
cannot be ranges.  Therefore, I've added template constraints to
front(), back(), popFront(), and popBack() in std.array that prevents
them from being instantiated with void[].
This commit is contained in:
Lars T. Kyllingstad 2010-11-05 12:12:55 +00:00
parent 3af7a383d1
commit 5264901ff4

View file

@ -276,7 +276,7 @@ void main()
*/ */
void popFront(A)(ref A a) void popFront(A)(ref A a)
if(!isNarrowString!A && isDynamicArray!A && notConst!A) if(!isNarrowString!A && isDynamicArray!A && notConst!A && !is(A == void[]))
{ {
alias typeof(A[0]) T; alias typeof(A[0]) T;
assert(a.length, "Attempting to popFront() past the end of an array of " assert(a.length, "Attempting to popFront() past the end of an array of "
@ -337,7 +337,7 @@ void main()
*/ */
void popBack(A)(ref A a) void popBack(A)(ref A a)
if(isDynamicArray!A && !isNarrowString!A && notConst!A) if(isDynamicArray!A && !isNarrowString!A && notConst!A && !is(A == void[]))
{ {
assert(a.length); assert(a.length);
a = a[0 .. $ - 1]; a = a[0 .. $ - 1];
@ -434,7 +434,8 @@ void main()
} }
---- ----
*/ */
ref typeof(A[0]) front(A)(A a) if (is(typeof(A[0])) && !isNarrowString!A) ref typeof(A[0]) front(A)(A a)
if (is(typeof(A[0])) && !isNarrowString!A && !is(typeof(A[0]) : const(void)))
{ {
assert(a.length, "Attempting to fetch the front of an empty array"); assert(a.length, "Attempting to fetch the front of an empty array");
return a[0]; return a[0];
@ -469,7 +470,8 @@ void main()
---- ----
*/ */
ref typeof(A.init[0]) back(A)(A a) ref typeof(A.init[0]) back(A)(A a)
if (is(typeof(A.init[0])) && !isNarrowString!A) if (is(typeof(A.init[0])) && !isNarrowString!A
&& !is(typeof(A.init[0]) : const(void)))
{ {
// @@@BUG@@@ The assert below crashes the unittest due to a bug in // @@@BUG@@@ The assert below crashes the unittest due to a bug in
// the compiler // the compiler