Goto

From Free Pascal wiki

Deutsch (de) English (en) français (fr) русский (ru)

goto is an unconditional jump to a previously declared label (either before or after the goto command).

Usage of goto in high-level programming languages such as Pascal is highly discredited, since control structures of all sorts are available. The last situation a goto is agreed with bad grace is a significant system error, where a “graceful exit” is better than causing a system breakdown.

As an example, here an excerpt from FPC's code base rtl/inc/extres.inc:

324 procedure InitResources;
328 label ExitErrMem, ExitErrFile, ExitNoErr;
329 begin
339   ResHeader:=GetMem(sizeof(TExtHeader));
340   if ResHeader=nil then goto ExitErrFile;
366   goto ExitNoErr;
367 
368   ExitErrMem:
369     FreeMem(ResHeader);
370     ResHeader:=nil;
371   ExitErrFile:
372     {$I-}
373     Close(fd);
374     {$I+}
375   ExitNoErr:
376 end;

According to the value of returnNilIfGrowHeapFails getMem possibly may return nil. Instead of placing everything in a “success”-branch, a couple goto instructions were chosen.

see also