https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106441

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #2)
> __analyzer_callee_test_3 (int a, int b, int (**out_fn) (int))
> {
>   int square (int z) { return z * z; }
> 
>   *out_fn = square;
> 
> This really should be warning that the assignment of the nested function is
> escaping the current scope because the chain value goes out of the scope at
> the end.

Sorry the FRAME (in this case FRAME.4).

If we look at the IR:

  __builtin_init_trampoline (&FRAME.4.square, square, &FRAME.4);
  _8 = __builtin_adjust_trampoline (&FRAME.4.square);
  _9 = (int (*<T34d>) (int)) _8;
  *out_fn_10(D) = _9;

__builtin_init_trampoline is setting up the trampoline (new function ptr) into
FRAME.4.square for the nested function square with the frame of FRAME.4.

__builtin_adjust_trampoline adjusts the trampoline if needed (usually just a
call to flush the icache) and will return a function pointer.

So _9/_8 will refer to the trampoline and/or frame that is an local variable
which goes out of scope when the function returns too.

Reply via email to