diff --git a/src/cc65/function.c b/src/cc65/function.c index 96b3d6c75..1d63d55c5 100644 --- a/src/cc65/function.c +++ b/src/cc65/function.c @@ -87,7 +87,6 @@ static Function* NewFunction (struct SymEntry* Sym) F->TopLevelSP = 0; F->RegOffs = RegisterSpace; F->Flags = IsTypeVoid (F->ReturnType) ? FF_VOID_RETURN : FF_NONE; - F->LocalsBlockCount = 0; InitCollection (&F->LocalsBlockStack); @@ -524,6 +523,8 @@ void NewFunc (SymEntry* Func) /* Need a starting curly brace */ ConsumeLCurly (); + + /* Make sure there is always something on the stack of local variable blocks */ CollAppend (&CurrentFunc->LocalsBlockStack, 0); /* Parse local variable declarations if any */ diff --git a/src/cc65/function.h b/src/cc65/function.h index 5c5822045..0954322ac 100644 --- a/src/cc65/function.h +++ b/src/cc65/function.h @@ -61,7 +61,6 @@ struct Function { int TopLevelSP; /* SP at function top level */ unsigned RegOffs; /* Register variable space offset */ funcflags_t Flags; /* Function flags */ - long LocalsBlockCount; /* Number of blocks with local vars */ Collection LocalsBlockStack; /* Stack of blocks with local vars */ }; diff --git a/src/cc65/locals.c b/src/cc65/locals.c index 20d370c46..d3d73d197 100644 --- a/src/cc65/locals.c +++ b/src/cc65/locals.c @@ -52,6 +52,7 @@ #include "standard.h" #include "symtab.h" #include "typeconv.h" +#include "input.h" @@ -270,6 +271,12 @@ static void ParseAutoDecl (Declaration* Decl) /* Mark the variable as referenced */ Sym->Flags |= SC_REF; + /* Make note of auto variables initialized in current block. + We abuse the Collection somewhat by using it to store line + numbers. */ + CollReplace (&CurrentFunc->LocalsBlockStack, (void *)(long)GetCurrentLine (), + CollCount (&CurrentFunc->LocalsBlockStack) - 1); + } else { /* Non-initialized local variable. Just keep track of ** the space needed. @@ -489,6 +496,9 @@ void DeclareLocals (void) /* Remember the current stack pointer */ int InitialStack = StackPtr; + /* A place to store info about potential initializations of auto variables */ + CollAppend (&CurrentFunc->LocalsBlockStack, 0); + /* Loop until we don't find any more variables */ while (1) { @@ -538,10 +548,9 @@ void DeclareLocals (void) /* Be sure to allocate any reserved space for locals */ F_AllocLocalSpace (CurrentFunc); - if (InitialStack != StackPtr) { - ++CurrentFunc->LocalsBlockCount; - /* Is it ok to abuse Collection in this way? */ - CollAppend (&CurrentFunc->LocalsBlockStack, (void *)CurrentFunc->LocalsBlockCount); + /* No auto variables were inited. No new block on the stack then. */ + if (CollLast (&CurrentFunc->LocalsBlockStack) == NULL) { + CollPop (&CurrentFunc->LocalsBlockStack); } /* In case we've allocated local variables in this block, emit a call to diff --git a/src/cc65/stmt.c b/src/cc65/stmt.c index b766ec044..0c891c386 100644 --- a/src/cc65/stmt.c +++ b/src/cc65/stmt.c @@ -513,6 +513,7 @@ static int CompoundStatement (void) /* Remember the stack at block entry */ int OldStack = StackPtr; + long OldBlockStackSize = CollCount (&CurrentFunc->LocalsBlockStack); /* Enter a new lexical level */ EnterBlockLevel (); @@ -535,7 +536,9 @@ static int CompoundStatement (void) g_space (StackPtr - OldStack); } - if (OldStack != StackPtr) { + /* If the segment had autoinited variables, let's pop it of a stack + of such blocks. */ + if (OldBlockStackSize != CollCount (&CurrentFunc->LocalsBlockStack)) { CollPop (&CurrentFunc->LocalsBlockStack); } diff --git a/src/cc65/symentry.c b/src/cc65/symentry.c index f78c5da80..18cc026ea 100644 --- a/src/cc65/symentry.c +++ b/src/cc65/symentry.c @@ -90,7 +90,7 @@ void FreeSymEntry (SymEntry* E) if (E->Flags & SC_LABEL) { for (i = 0; i < CollCount (E->V.L.DefsOrRefs); i++) { - xfree (CollAt(E->V.L.DefsOrRefs, i)); + xfree (CollAt (E->V.L.DefsOrRefs, i)); } DoneCollection (E->V.L.DefsOrRefs); diff --git a/src/cc65/symentry.h b/src/cc65/symentry.h index 03a63a7d2..2dc731f35 100644 --- a/src/cc65/symentry.h +++ b/src/cc65/symentry.h @@ -105,7 +105,7 @@ struct LiteralPool; typedef struct DefOrRef DefOrRef; struct DefOrRef { unsigned Line; - long LocalsBlockNum; + long LocalsBlockId; unsigned Flags; int StackPtr; unsigned Depth; diff --git a/src/cc65/symtab.c b/src/cc65/symtab.c index f7fb07f61..5ca2d4967 100644 --- a/src/cc65/symtab.c +++ b/src/cc65/symtab.c @@ -668,7 +668,7 @@ DefOrRef* AddDefOrRef(SymEntry* E, unsigned Flags) 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); @@ -677,12 +677,13 @@ DefOrRef* AddDefOrRef(SymEntry* E, unsigned Flags) 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)); @@ -700,35 +701,40 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags) 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); } } diff --git a/test/misc/Makefile b/test/misc/Makefile index 330c9d500..ad39176bd 100644 --- a/test/misc/Makefile +++ b/test/misc/Makefile @@ -72,6 +72,11 @@ $(WORKDIR)/limits.$1.$2.prg: limits.c $(DIFF) $(SIM65) $(SIM65FLAGS) $$@ > $(WORKDIR)/limits.$1.out $(DIFF) $(WORKDIR)/limits.$1.out limits.ref +$(WORKDIR)/goto.$1.$2.prg: goto.c $(DIFF) + $(if $(QUIET),echo misc/goto.$1.$2.prg) + $(CL65) -t sim$2 -$1 -o $$@ $$< 2>$(WORKDIR)/goto.$1.out + $(DIFF) $(WORKDIR)/goto.$1.out goto.ref + # the rest are tests that fail currently for one reason or another $(WORKDIR)/fields.$1.$2.prg: fields.c | $(WORKDIR) @echo "FIXME: " $$@ "currently will fail." diff --git a/test/misc/goto.c b/test/misc/goto.c new file mode 100644 index 000000000..69247a4df --- /dev/null +++ b/test/misc/goto.c @@ -0,0 +1,437 @@ +void main () { + goto end; + { + int a = 1; +start: + goto end; + } + goto start; +end:; +} + +void f2 () { + int a = 2; + +l1: + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a; + l2:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a; + l3:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a; + l4:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + l5:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + l6:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } +l7:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a = 1; + l8:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a = 1; + l9:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a = 1; + la:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + lb:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + lc:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + { + int a = 1; + ld:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a = 1; + le:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + { + int a = 1; + lf:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + lg:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } + lh:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; + } +li:; + goto l1; + goto l2; + goto l3; + goto l4; + goto l5; + goto l6; + goto l7; + goto l8; + goto l9; + goto la; + goto lb; + goto lc; + goto ld; + goto le; + goto lf; + goto lg; + goto lh; + goto li; +} + +/* Structure of the above function. + +void f2 () { + int a = 2; + +l1: + { + int a; + l2:; + { + int a; + l3:; + { + int a; + l4:; + } + l5:; + } + l6:; + } +l7:; + { + int a = 1; + l8:; + { + int a = 1; + l9:; + { + int a = 1; + la:; + } + lb:; + } + lc:; + } + { + int a = 1; + ld:; + { + int a = 1; + le:; + { + int a = 1; + lf:; + } + lg:; + } + lh:; + } +li:; +} +*/ diff --git a/test/misc/goto.ref b/test/misc/goto.ref new file mode 100644 index 000000000..0f57d97ba --- /dev/null +++ b/test/misc/goto.ref @@ -0,0 +1,150 @@ +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.