On Tue, Dec 18, 2018 at 10:23:46AM -0500, Paul Koning wrote: > > > > On Dec 17, 2018, at 2:23 PM, Szabolcs Nagy <szabolcs.n...@arm.com> wrote: > > > > On 17/12/2018 18:22, Uecker, Martin wrote: > >>> > >>> ... > >> > >> So a thread_local static variable for storing the static > >> chain? > > > > something like that, but the more i think about it the > > harder it seems: the call site of the nested function > > may not be under control of the nested function writer, > > in particular the nested function may be called on a > > different thread, and extern library apis are unlikely > > to provide guarantees about this, so in general if a > > nested function escapes into an extern library then > > this cannot be relied on, which limits my original > > idea again to cases where there is no escape (which i > > think is not that useful). > > I'm not sure I understand "escape" of a nested function pointer. > > Your description makes it sound like you're talking about a function being > called by someone who has been given the pointer, from outside the scope of > the function. That sounds like an illegal operation, exactly as it would be > if you attempted to reference an automatic variable via a pointer from > outside the scope of that variable. > > Did I misunderstand?
The most common case is when you pass a call to a nested function to some function that has a function pointer argument, e.g. qsort. This is well defined with GNU nested functions, but the function that calls the callback (qsort in this case) doesn't know it is a call to a nested function. #include <stdlib.h> #include <stdbool.h> int main () { bool r = false; auto int cmp (const void *a, const void *b) { const signed char *c = (const signed char *) a; const signed char *d = (const signed char *) b; return r ? *c - *d : *d - *c; } signed char l[8] = { 10, 2, 11, 21, 0, 7, 18, 12 }; qsort (l, 8, 1, cmp); } Jakub