DOR = xmalloc (sizeof (DefOrRef));
CollAppend (E->V.L.DefsOrRefs, DOR);
DOR->Line = GetCurrentLine ();
- DOR->LocalsBlockNum = (long)CollLast (&CurrentFunc->LocalsBlockStack);
+ DOR->LocalsBlockId = (long)CollLast (&CurrentFunc->LocalsBlockStack);
DOR->Flags = Flags;
DOR->StackPtr = StackPtr;
DOR->Depth = CollCount (&CurrentFunc->LocalsBlockStack);
return DOR;
}
-
SymEntry* AddLabelSym (const char* Name, unsigned Flags)
/* Add a goto label to the label table */
{
unsigned i;
DefOrRef *DOR, *NewDOR;
+ /* We juggle it so much that a shortcut will help with clarity */
+ Collection *AIC = &CurrentFunc->LocalsBlockStack;
/* Do we have an entry with this name already? */
SymEntry* Entry = FindSymInTable (LabelTab, Name, HashStr (Name));
for (i = 0; i < CollCount (Entry->V.L.DefsOrRefs); i++) {
DOR = CollAt (Entry->V.L.DefsOrRefs, i);
- if((DOR->Flags & SC_DEF) && (Flags & SC_REF)) {
+ if ((DOR->Flags & SC_DEF) && (Flags & SC_REF)) {
/* We're processing a goto and here is its destination label.
This means the difference between SP values is already known,
so we simply emit the SP adjustment code. */
- if(StackPtr != DOR->StackPtr)
+ if (StackPtr != DOR->StackPtr) {
g_space (StackPtr - DOR->StackPtr);
+ }
- /* Are we jumping into same or deeper nesting region? That's risky,
- so let's emit a warning. */
- if (CollCount (&CurrentFunc->LocalsBlockStack) <= DOR->Depth &&
- DOR->LocalsBlockNum != (long)CollLast (&CurrentFunc->LocalsBlockStack)) {
- Warning ("Goto from line %d to label \'%s\' can result in a "
- "trashed stack", DOR->Line, Name);
+ /* Are we jumping into a block with initalization of an object that
+ has automatic storage duration? Let's emit a warning. */
+ if ((long)CollLast (AIC) != DOR->LocalsBlockId &&
+ (CollCount (AIC) < DOR->Depth ||
+ (long)CollAt (AIC, DOR->Depth - 1) != DOR->LocalsBlockId)) {
+ Warning ("Goto at line %d to label %s jumps into a block with "
+ "initialization of an object that has automatic storage duration.",
+ GetCurrentLine (), Name);
}
}
- if((DOR->Flags & SC_REF) && (Flags & SC_DEF)) {
+
+ if ((DOR->Flags & SC_REF) && (Flags & SC_DEF)) {
/* We're processing a label, let's update all gotos encountered
so far */
g_defdatalabel (DOR->LateSP_Label);
g_defdata (CF_CONST | CF_INT, StackPtr - DOR->StackPtr, 0);
- /* Are we jumping into same or deeper nesting region? That's risky,
- so let's emit a warning. */
- if (CollCount (&CurrentFunc->LocalsBlockStack) >= DOR->Depth &&
- DOR->LocalsBlockNum != (long)CollLast (&CurrentFunc->LocalsBlockStack)) {
- Warning ("Goto from line %d to label \'%s\' can result in a "
- "trashed stack", DOR->Line, Name);
- }
+ /* Are we jumping into a block with initalization of an object that
+ has automatic storage duration? Let's emit a warning. */
+ if ((long)CollLast (AIC) != DOR->LocalsBlockId &&
+ (CollCount (AIC) >= DOR->Depth ||
+ (long)CollLast (AIC) >= DOR->Line))
+ Warning ("Goto at line %d to label %s jumps into a block with "
+ "initialization of an object that has automatic storage duration.",
+ DOR->Line, Name);
}
}
--- /dev/null
+goto.c(8): Warning: Goto at line 8 to label start jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(97): Warning: `a' is defined but never used
+goto.c(117): Warning: `a' is defined but never used
+goto.c(137): Warning: `a' is defined but never used
+goto.c(159): Warning: Goto at line 23 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 44 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 65 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 86 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 106 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 126 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 146 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 24 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 45 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 66 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 87 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 107 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 127 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 147 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 168 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 25 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 46 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 67 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 88 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 108 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 128 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 148 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 169 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 190 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 26 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 47 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 68 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 89 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 109 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 129 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 149 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 170 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(231): Warning: Goto at line 231 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 27 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 48 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 69 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 90 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 110 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 130 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 150 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(250): Warning: Goto at line 250 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(251): Warning: Goto at line 251 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(252): Warning: Goto at line 252 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 28 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 49 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 70 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 91 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 111 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 131 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 151 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 172 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 193 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 214 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 234 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 254 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(271): Warning: Goto at line 271 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(272): Warning: Goto at line 272 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(273): Warning: Goto at line 273 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(274): Warning: Goto at line 274 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(275): Warning: Goto at line 275 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 29 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 50 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 71 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 92 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 112 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 132 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 152 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 173 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 194 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 215 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 235 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 255 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 277 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(292): Warning: Goto at line 292 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(293): Warning: Goto at line 293 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(294): Warning: Goto at line 294 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(295): Warning: Goto at line 295 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(296): Warning: Goto at line 296 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 30 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 51 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 72 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 93 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 113 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 133 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 153 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 174 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 195 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 216 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 236 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 256 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 278 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 299 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(313): Warning: Goto at line 313 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(314): Warning: Goto at line 314 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(315): Warning: Goto at line 315 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(316): Warning: Goto at line 316 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(317): Warning: Goto at line 317 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 31 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 52 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 73 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 94 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 114 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 134 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 154 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 175 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 196 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 217 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 237 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 257 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 279 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(333): Warning: Goto at line 333 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(334): Warning: Goto at line 334 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(335): Warning: Goto at line 335 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(336): Warning: Goto at line 336 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(337): Warning: Goto at line 337 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(340): Warning: Goto at line 340 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 32 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 53 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 74 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 95 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 115 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 135 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 155 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 176 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 197 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 218 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 238 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 258 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(353): Warning: Goto at line 353 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(354): Warning: Goto at line 354 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(355): Warning: Goto at line 355 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(356): Warning: Goto at line 356 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(357): Warning: Goto at line 357 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(359): Warning: Goto at line 359 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(360): Warning: Goto at line 360 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(361): Warning: Goto at line 361 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(373): Warning: Goto at line 373 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(374): Warning: Goto at line 374 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(375): Warning: Goto at line 375 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(376): Warning: Goto at line 376 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(377): Warning: Goto at line 377 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(378): Warning: Goto at line 378 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(379): Warning: Goto at line 379 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(380): Warning: Goto at line 380 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(381): Warning: Goto at line 381 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(382): Warning: Goto at line 382 to label lh jumps into a block with initialization of an object that has automatic storage duration.