Bug 4667 – Goto skipping variable initializations

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2010-08-17T07:49:00Z
Last change time
2010-08-18T09:02:59Z
Keywords
diagnostic
Assigned to
nobody
Creator
bearophile_hugs

Comments

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.