Out of bound problem
Neil Vice
psgdg at swiftdsl.com.au
Sat Feb 16 18:37:53 PST 2008
"bearophile" <bearophileHUGS at lycos.com> wrote in message
news:fp800a$2781$1 at digitalmars.com...
> While testing I have found a problem in my code, I have reduced the code
> to the following lines:
>
> template IsArray(T) {
> const bool IsArray = is(typeof(T.length)) && is(typeof(T.sort)) &&
> is(typeof(T.reverse)) && is(typeof(T.dup));
> }
>
> TA[] foo(TA, TB)(TA[] a, TB b) {
> TA[] result;
>
> static if (IsArray!(TB)) {
> if (b.length == 0) {
> result = a;
> } else if (b.length == 1) {
> result = foo(a, b[0]);
> }
> }
>
> return result;
> }
>
> void main() {
> foo("test", "");
> }
>
>
> Its output:
>
> bug.d(13): Error: array index 0 is out of bounds b[0 .. 0]
> bug.d(13): Error: array index 0 is out of bounds b[0 .. 0]
> bug.d(13): Error: array index 0 is out of bounds b[0 .. 0]
> bug.d(21): template instance bug.foo!(char,char[0u]) error instantiating
>
> I have found ways to solve this problem, but can someone please explain me
> what's the problem?
>
> Bye and thank you,
> bearophile
As far as I can tell the cause is that the expression b[0] is being
evaluated even if the enclosing if statement hasn't been entered. For
example if the line containing b[0] is replaced with a writef() it is never
output to the console.
I can only assume that this is a compiler bug.
More information about the Digitalmars-d-learn
mailing list