chris Dark Lord of the Sith

Joined: 10 May 2003 Posts: 6262 Location: Outer Space
|
Posted: Thu Mar 02, 2006 12:10 pm Post subject: gcc error: crosses initialization of XXX |
|
|
|
Problem: You get an error of this form, while compiling some nice program from source:
| Code: |
error: jump to case label
error: crosses initialization of `bool pushed'
|
The offending code contains a switch statement and a declaration of some variable or object inside one of its cases:
| Code: |
case HD_ELEMENT_UL :
bool pushed = t->style->margin[HD_POS_LEFT] != 0.0 ||
t->style->margin[HD_POS_RIGHT] != 0.0;
if (pushed)
margins->push(margins->left() + t->style->margin[HD_POS_LEFT],
margins->right() - t->style->margin[HD_POS_RIGHT],
margins->bottom(), 0);
parse_contents(t->child, margins, y, page, heading, chap);
if (pushed)
margins->pop();
break;
|
Reason: The problem is that there is a declaration of an object (the boolean "pushed") without scope. Thus, the scope of the object could traverse the break statement and apply to the next case. Consider this - what is the scope of obj1 in the code below? It starts at the first label, and goes until the end of the case block. So it's in scope at CHOICE_B. But its constructor wasn't called....
| Code: |
switch (choice) {
case CHOICE_A:
someclass obj1(&commonobj);
break;
case CHOICE_B:
someotherclass obj2(&commonobj);
break;
default:
break;
}
}
|
Thus, you should use curly brackets to delimit scope, as in:
| Code: |
switch (choice) {
case A: {
someobj x;
...
}
break;
case B: {
...
}
break;
...
}
|
Solution: Change the case statement to:
| Code: |
case HD_ELEMENT_UL :
{
bool pushed = t->style->margin[HD_POS_LEFT] != 0.0 ||
t->style->margin[HD_POS_RIGHT] != 0.0;
if (pushed)
margins->push(margins->left() + t->style->margin[HD_POS_LEFT],
margins->right() - t->style->margin[HD_POS_RIGHT],
margins->bottom(), 0);
parse_contents(t->child, margins, y, page, heading, chap);
if (pushed)
margins->pop();
}
break;
|
i.e. add curly brackets to delimit the scope of "pushed" inside the switch.
References:
Bug#180937: g++ internal compiler error: Error reporting routines re-entered
Bug#180937: g++ internal compiler error: Error reporting routines re-entered _________________ Regards
Chris Karakas
www.karakas-online.de |
|