[cfe-dev] clang comparison webpage

Mouse mouse at Rodents-Montreal.ORG
Mon Dec 9 12:04:27 PST 2013


> So back when I investigated this a few years ago, it turned out a lot
> of people asking for nested functions were in fact just using them as
> syntactic sugar to get local scoping for things like unit tests in C.

> We could avoid most of the unpleasant stuff if we restrict support to
> direct calling as I think the trampolines are only needed to take the
> address as a function pointer.

Yes.

> Ditto cross-function goto with local labels.

Yes; they are hard only when control passes outside the outermost scope
involved, in between setup and goto.

> Mouse, would this "safe" but limited implementation of nested
> functions meet your use-case?

Some but definitely not all of them.  Some of them are cases like
wanting a recursive function which references lexically local things
like function arguments; those would be fine with such an
implementation.  But some of my use cases are, basically, currying,
things like turning a three-argument "compare X and Y with context Z"
function into something that can be passed to an external API like
qsort.  And some are essentially "better longjmp" things like

...
{
 __label__ out;

 void throw_out(void)
  { goto out;
  }

 if (0)
  {
out:;
    ...maybe do a little cleanup...
    return;
  }
 ...
 errthrow = &throw_out; /* errthrow is file- or program-global */
 /* or */
 something(...,&throw_out); /* last arg is called to abort processing */
 ...
}

(one of the two real uses I've found for "if (0)").

/~\ The ASCII				  Mouse
\ / Ribbon Campaign
 X  Against HTML		mouse at rodents-montreal.org
/ \ Email!	     7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B



More information about the cfe-dev mailing list