Thread overview | ||||||
---|---|---|---|---|---|---|
|
April 07, 2006 Error message for unreachable code | ||||
---|---|---|---|---|
| ||||
Hi, The following code: void main() { char[0] x; if (x.length > 0) { char y = x[0]; } } Refuses to compile with the following error message: zeroarray.d(4): array index [0] is outside array bounds [0 .. 0] And before someone asks why I would declare a zero length static array I better tell that this is occurs in template code where the type of x can be both static and dynamic arrays. My current workaround looks like this: template ZeroLengthStaticArray(X:X[0]) { alias X ZeroLengthStaticArray; } void main() { char[0] x; static if(!is(ZeroLengthStaticArray!(typeof(x)))) { if (x.length > 0) { char y = x[0]; } } } (There are of course other ways, but they all make the code less readable.) I realize that this could potentially be problematic to correct. I could live with the workaround, especially if it is anything but trivial to fix. I see this as an interesting case of where DMD issues an error for valid code, where a typical C compiler at most would issue a warning. The generated code (with or without const folding) will be correct. I would like to hear why DMD considers the above an error while for instance functions without return values are not. /Oskar |
April 08, 2006 Re: Error message for unreachable code | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oskar Linde | Oskar Linde wrote: > Hi, > > The following code: > > void main() { > char[0] x; > if (x.length > 0) { > char y = x[0]; > } > } > > Refuses to compile with the following error message: > > zeroarray.d(4): array index [0] is outside array bounds [0 .. 0] > > And before someone asks why I would declare a zero length static array I better tell that this is occurs in template code where the type of x can be both static and dynamic arrays. > > My current workaround looks like this: > > template ZeroLengthStaticArray(X:X[0]) { > alias X ZeroLengthStaticArray; > } > > void main() { > char[0] x; > static if(!is(ZeroLengthStaticArray!(typeof(x)))) { > if (x.length > 0) { > char y = x[0]; > } > } > } > > (There are of course other ways, but they all make the code less readable.) > > I realize that this could potentially be problematic to correct. I could live with the workaround, especially if it is anything but trivial to fix. > > I see this as an interesting case of where DMD issues an error for valid code, where a typical C compiler at most would issue a warning. The generated code (with or without const folding) will be correct. I would like to hear why DMD considers the above an error while for instance functions without return values are not. > > /Oskar Yes, it doesn't seem good to me either. As for the resolution, hum, I think ideally the compiler should be smart enough to detect such unreachable code and ignore errors that will never come to happen. -- Bruno Medeiros - CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D |
April 11, 2006 Re: Error message for unreachable code | ||||
---|---|---|---|---|
| ||||
Posted in reply to Oskar Linde | Oskar Linde wrote:
> I see this as an interesting case of where DMD issues an error for valid code, where a typical C compiler at most would issue a warning. The generated code (with or without const folding) will be correct. I would like to hear why DMD considers the above an error while for instance functions without return values are not.
It comes about from constant folding. It would be difficult for the compiler to tell that this code is unreachable.
|
April 12, 2006 Re: Error message for unreachable code | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter Bright | Walter Bright wrote:
> Oskar Linde wrote:
>> I see this as an interesting case of where DMD issues an error for valid code, where a typical C compiler at most would issue a warning. The generated code (with or without const folding) will be correct. I would like to hear why DMD considers the above an error while for instance functions without return values are not.
>
> It comes about from constant folding. It would be difficult for the compiler to tell that this code is unreachable.
How come? The compiler clearly knows the bounds of x at the instruction x[0], so why not constant fold the x.length as well?
L.
|
Copyright © 1999-2021 by the D Language Foundation