[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #11 from alex dot pyattaev at gmail dot com 2010-05-09 23:29 --- (In reply to comment #10) > (In reply to comment #9) > > > > A good example of seemingly normal code is following: > > switch (whatever) > > { > > case 1: > > int i=0; > > i++; > > printf("%d",i); > > break; > > } > > It is technically perfectly legal to declare i as a local variable. However, > > the compiler issues an error. And it is absolutely not clear why "int i=0;" > > is > > not a statement. That is probably the only really annoying case. Moving > > declaration of i into a code block solves the issue. I spent like 10 minutes > > trying to find out why perfectly legal code would not compile. > > > > Not to beat a dead horse here but... > > Because that is *not* perfectly legal C code, and will not be valid C++ code > if > you add another case label after it (jump over initialization)? A declaration > ("int i") is not a statement. > > That fails on both MSVC and gcc. In fact, MSVC will still barf even after > adding a semicolon after the label to make it a statement. (MSVC error is > "error 2143: missing ';' before type") > Ok, lets have pity for dead horse. Let it be as it is=) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #10 from dougsemler at gmail dot com 2010-05-09 23:25 --- (In reply to comment #9) > > A good example of seemingly normal code is following: > switch (whatever) > { > case 1: > int i=0; > i++; > printf("%d",i); > break; > } > It is technically perfectly legal to declare i as a local variable. However, > the compiler issues an error. And it is absolutely not clear why "int i=0;" is > not a statement. That is probably the only really annoying case. Moving > declaration of i into a code block solves the issue. I spent like 10 minutes > trying to find out why perfectly legal code would not compile. > Not to beat a dead horse here but... Because that is *not* perfectly legal C code, and will not be valid C++ code if you add another case label after it (jump over initialization)? A declaration ("int i") is not a statement. That fails on both MSVC and gcc. In fact, MSVC will still barf even after adding a semicolon after the label to make it a statement. (MSVC error is "error 2143: missing ';' before type") -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #9 from alex dot pyattaev at gmail dot com 2010-05-09 19:07 --- (In reply to comment #7) > I have encountered the bug with switch construct. And the problem is not the > error message, but the fact that it is still compiling just fine this code: > switch (chan_prop.model_type) > { > case CM_STATIC: > return static_channel_model(src, ntransmitters, dst, > &chan_prop); > case CM_FRISS: > return friss_channel_model(src, ntransmitters, dst, >&chan_prop); > default: > return -1; > } > There should be some consistency at least! I'd like to see this fixed > properly. > The compiler should be perfectly predictable, and not like "Sorry, i don't > like > this construct here... put a semicolon please". > > I'd like this bug to be reopened and FIXED PROPERLY > > gcc --version = (Gentoo 4.4.3-r2 p1.2) 4.4.3 > A good example of seemingly normal code is following: switch (whatever) { case 1: int i=0; i++; printf("%d",i); break; } It is technically perfectly legal to declare i as a local variable. However, the compiler issues an error. And it is absolutely not clear why "int i=0;" is not a statement. That is probably the only really annoying case. Moving declaration of i into a code block solves the issue. I spent like 10 minutes trying to find out why perfectly legal code would not compile. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #8 from manu at gcc dot gnu dot org 2010-05-09 15:26 --- (In reply to comment #7) > There should be some consistency at least! I'd like to see this fixed > properly. > The compiler should be perfectly predictable, and not like "Sorry, i don't > like It is predictable: a label can only be part of a statement and a declaration is not a statement. Now "return x;" is a statement, so it compiles fine. This is mandated by the C standard, it is not the compiler's decision. Does it work different with any other compiler? Please, tell us what is difficult to understand in the error message and how could it be better explained. On the other hand, I don't know whether if GCC adds an empty statement before the declaration and just emits a warning with -pedantic, then it still complies with the C standard. I don't have time to investigate this, sorry. > this construct here... put a semicolon please". > > I'd like this bug to be reopened and FIXED PROPERLY > > gcc --version = (Gentoo 4.4.3-r2 p1.2) 4.4.3 > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #7 from alex dot pyattaev at gmail dot com 2010-05-09 10:29 --- I have encountered the bug with switch construct. And the problem is not the error message, but the fact that it is still compiling just fine this code: switch (chan_prop.model_type) { case CM_STATIC: return static_channel_model(src, ntransmitters, dst, &chan_prop); case CM_FRISS: return friss_channel_model(src, ntransmitters, dst, &chan_prop); default: return -1; } There should be some consistency at least! I'd like to see this fixed properly. The compiler should be perfectly predictable, and not like "Sorry, i don't like this construct here... put a semicolon please". I'd like this bug to be reopened and FIXED PROPERLY gcc --version = (Gentoo 4.4.3-r2 p1.2) 4.4.3 -- alex dot pyattaev at gmail dot com changed: What|Removed |Added CC||alex dot pyattaev at gmail ||dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #6 from manu at gcc dot gnu dot org 2009-07-09 09:25 --- Is this mandated to be an error by the standard? Perhaps GCC could just pedwarn and add the ';' itself, and compile just fine. Otherwise, I might add a hint: note: either add ';' or open a block after the label. Thoughts? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #5 from manu at gcc dot gnu dot org 2009-07-08 21:34 --- (In reply to comment #4) > (In reply to comment #3) > > Above code doesn't compile: > > Yes it should not be compile. The error message has been improved to tell you > what the problem is (that is what Manu was saying in his comment #2). Indeed. Aapo, what is difficult to understand from the the current error message? I would like to improve it as much as possible. -- manu at gcc dot gnu dot org changed: What|Removed |Added CC||aapo dot rantalainen at ||gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #4 from pinskia at gcc dot gnu dot org 2009-07-08 19:42 --- (In reply to comment #3) > Above code doesn't compile: Yes it should not be compile. The error message has been improved to tell you what the problem is (that is what Manu was saying in his comment #2). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #3 from aapo dot rantalainen at gmail dot com 2009-07-08 19:36 --- Above code doesn't compile: int main(int argc, char *argv[]) { int a=1; switch (a) { case 1: int b=2; break; } return 0; } Error "a label can only be part of a statement and a declaration is not a statement" Same workaround: add ; before int b=2; gcc -v Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #2 from manu at gcc dot gnu dot org 2008-08-25 18:55 --- I think this was fixed already in GCC 4.3. -- manu at gcc dot gnu dot org changed: What|Removed |Added CC||manu at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231
[Bug c/37231] GCC does not compile code with label statements that are followed by a declaration
--- Comment #1 from paolo dot carlini at oracle dot com 2008-08-25 10:43 --- I think the improved error message in mainline makes clear this is invalid (the EDG front-end agrees, by the way): 37231.c:6: error: a label can only be part of a statement and a declaration is not a statement And the "work-around" is indeed Ok. -- paolo dot carlini at oracle dot com changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231