Comment #0 by bearophile_hugs — 2010-08-17T07:49:03Z
This D2 code runs with no errors (DMD 2.048):
import std.c.stdio: printf;
void main(string[] args) {
if (args.length < 2)
goto FOO1;
int x = 100;
FOO1:
printf("%d\n", x);
goto FOO2;
for (int i = 0; i < 10; i++) {
FOO2:
printf("%d\n", i);
break;
}
}
But that's not good code, the initialization of i is always skipped, and the initialization of x is sometimes skipped.
bernardh in IRC #D quotes from TDPL:
"another restriction is that a goto cannot skip the definition point of a value that's visible at the landing point."
See also bug 3820
Similar code in C99:
#include "stdio.h"
int main(int argc, const char* argv[]) {
if (argc < 2)
goto FOO1;
int x = 100;
FOO1:
printf("%d\n", x);
goto FOO2;
for (int i = 0; i < 10; i++) {
FOO2:
printf("%d\n", i);
break;
}
return 0;
}
Compiled with GCC 4.5.0 shows a warning:
...>gcc -Wall -std=c99 -m32 test.c -o test
test.c: In function 'main':
test.c:13:15: warning: 'i' is used uninitialized in this function
Comment #1 by bugzilla — 2010-08-17T09:51:02Z
*** This issue has been marked as a duplicate of issue 602 ***
Comment #2 by bearophile_hugs — 2010-08-17T10:51:52Z
Thank you and sorry for the dupe.
(I hope the people that try to fix one bug take a look at all the contents of the 'duplicated' bugs, because sometimes they may be not fully duplicated.)
Comment #3 by smjg — 2010-08-18T09:02:59Z
If a duplicate bug provides more information or a testcase that might still fail after the original is fixed, then it's a good idea to add it as a comment to the original bug report, possibly with a note at the beginning like "From duplicate bug 4667".
But looking at duplicate bug reports just in case is probably indeed also a good idea.