Discussion:
error: jump to case label
(too old to reply)
Neil Zanella
2004-04-02 23:09:00 UTC
Permalink
Hello,

Does anyone know what the following g++ compiler error message means:

error: jump to case label

I get this error when switching two case labels together with their bodies.
I have no setjmp/longjmp or gotos in my program.

Thanks,

Neil
Bill Seurer
2004-04-02 23:31:47 UTC
Permalink
Post by Neil Zanella
I get this error when switching two case labels together with their bodies.
Explain that further or better yet post the offending code.
Neil Zanella
2004-04-03 19:11:46 UTC
Permalink
Post by Bill Seurer
Post by Neil Zanella
I get this error when switching two case labels together with their bodies.
Explain that further or better yet post the offending code.
Sure I will. Here is the code. Uncommenting the lines for case 1 produces
the compiler error message. Furthermore, out of curiosity, as an unrelated
matter, I am quite interested in knowing how come the program starts looping
when some large number is entered.

Thanks,

Neil

#include <iostream>

int main() {
unsigned int x; do {
std::cout << "Please enter an integer: " << std::flush;
std::cin >> x;
switch (x) {
case 0:
std::cout << "Hello!" << std::endl;
break;
default:
unsigned int y = ++x;
std::cout << "You could have entered " << y;
std::cout << ". Why didn't you?" << std::endl;
break;
//case 1:
// std::cout << "What??? You entered one?" << std::endl;
// break;
}
} while (x != 0);
}
Jacek Dziedzic
2004-04-04 04:07:44 UTC
Permalink
Post by Neil Zanella
Sure I will. Here is the code. Uncommenting the lines for case 1 produces
the compiler error message.
Try moving them before the 'default'
Post by Neil Zanella
Furthermore, out of curiosity, as an unrelated
matter, I am quite interested in knowing how come the program starts looping
when some large number is entered.
cin.fail() is set and all subsequent ">>" operations are ignored,
with x unmodified every time. Hence, if x happened to be non-zero,
the loop iterates infinitely.
Post by Neil Zanella
Thanks,
Neil
#include <iostream>
int main() {
unsigned int x; do {
std::cout << "Please enter an integer: " << std::flush;
std::cin >> x;
switch (x) {
std::cout << "Hello!" << std::endl;
break;
unsigned int y = ++x;
std::cout << "You could have entered " << y;
std::cout << ". Why didn't you?" << std::endl;
break;
// std::cout << "What??? You entered one?" << std::endl;
// break;
}
} while (x != 0);
}
HTH,
- J.
Neil Zanella
2004-04-04 11:22:36 UTC
Permalink
Post by Jacek Dziedzic
Try moving them before the 'default'
Thank you for your reply...
I know that works but that doens't really explain the nature of the problem.

Regards,

Neil
Post by Jacek Dziedzic
Post by Neil Zanella
#include <iostream>
int main() {
unsigned int x; do {
std::cout << "Please enter an integer: " << std::flush;
std::cin >> x;
switch (x) {
std::cout << "Hello!" << std::endl;
break;
unsigned int y = ++x;
std::cout << "You could have entered " << y;
std::cout << ". Why didn't you?" << std::endl;
break;
// std::cout << "What??? You entered one?" << std::endl;
// break;
}
} while (x != 0);
}
HTH,
- J.
Buster
2004-04-04 14:47:06 UTC
Permalink
Post by Neil Zanella
Post by Jacek Dziedzic
Try moving them before the 'default'
Thank you for your reply...
I know that works but that doens't really explain the nature of the problem.
Please don't top-post.
Post by Neil Zanella
Post by Jacek Dziedzic
Post by Neil Zanella
#include <iostream>
int main() {
unsigned int x; do {
std::cout << "Please enter an integer: " << std::flush;
std::cin >> x;
switch (x) {
std::cout << "Hello!" << std::endl;
break;
unsigned int y = ++x;
std::cout << "You could have entered " << y;
std::cout << ". Why didn't you?" << std::endl;
break;
// std::cout << "What??? You entered one?" << std::endl;
// break;
}
} while (x != 0);
}
James Gregory is right. The 'jump' in the error message is the computed
goto effected by the switch statement. When x = 1, the switch acts like
this:

goto case_label_1;
// ...
unsigned int y = ++ x;
// ...
case_label_1:
// here y is uninitialized

The problem is that the initialization of y is skipped when x == 1.
When the "case 1:" label is reached, stack space has been allocated for
y but its value has not been initialized. This is not allowed.

The general way round this situation is to make the scope of y smaller
by adding braces:

switch (x)
{
default:
unsigned z; // this is OK since z is uninitialized
{
unsigned y = x + 1;
// ...
}
case 1:
z = 2;
// ...
// cannot refer to y here so no problem with y's initialization
}
--
Regards,
Buster.
James Gregory
2004-04-03 13:41:20 UTC
Permalink
Post by Neil Zanella
Hello,
error: jump to case label
I get this error when switching two case labels together with their bodies.
I have no setjmp/longjmp or gotos in my program.
Perhaps the problem is "jump to case label croses initialization"?

The following is not allowed:

switch (a)
{
case 1:
int a = 6;
//stuff
break;

case 2:
//stuff
break;
}

The following is allowed:

switch (a)
{
case 1:
{
int a = 6;
//stuff
}
break;

case 2:
//stuff
break;
}

James
Continue reading on narkive:
Loading...