aaronpuchert wrote: Good question. Which AST nodes could we visit here? Let's see some examples of initializing function pointers/references:
```c++ void f(); void (*fp)() = f; void (*fp2)() = &f; void (*fp3)() = fp; void (&fr)() = f; ``` The (simplified) AST: ``` TranslationUnitDecl 0x55edc65d3778 |-FunctionDecl 0x55edc661d910 used f 'void ()' |-VarDecl 0x55edc661dac0 used fp 'void (*)()' cinit | `-ImplicitCastExpr 'void (*)()' <FunctionToPointerDecay> | `-DeclRefExpr 'void ()' lvalue Function 0x55edc661d910 'f' 'void ()' |-VarDecl 0x55edc661dbe8 fp2 'void (*)()' cinit | `-UnaryOperator 'void (*)()' prefix '&' cannot overflow | `-DeclRefExpr 'void ()' lvalue Function 0x55edc661d910 'f' 'void ()' |-VarDecl 0x55edc661dd48 fp3 'void (*)()' cinit | `-ImplicitCastExpr 'void (*)()' <LValueToRValue> | `-DeclRefExpr 'void (*)()' lvalue Var 0x55edc661dac0 'fp' 'void (*)()' `-VarDecl 0x55edc661dea0 fr 'void (&)()' cinit `-DeclRefExpr 'void ()' lvalue Function 0x55edc661d910 'f' 'void ()' ``` The third and fourth declarations are tricky. I don't see an AST node that we could attach to for finding this. Perhaps we should adapt Sema to add casts for the attributes? Then we could always attach to the `ImplicitCastExpr`. (Note that the `LValueToRValue` cast is orthogonal and not relevant for this, it simply means we're reading `fp`.) https://github.com/llvm/llvm-project/pull/67095 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits