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

Reply via email to