[clang] [clang][bytecode] Add InitLinkScope for temporary variables (PR #106552)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 10 11:39:56 PDT 2024


AaronBallman wrote:

> In this code:
> 
> ```c++
> namespace ExplicitThisInTemporary {
>  struct B { B *p = this; };
>   constexpr bool g(B b) { return &b == b.p; }
>   static_assert(g({}), "");
> }
> ```
> 
> The AST for the `static_assert` expr is:
> 
> ```
> CallExpr 0x52100009ed98 '_Bool'
> |-ImplicitCastExpr 0x52100009ed78 '_Bool (*)(B)' <FunctionToPointerDecay>
> | `-DeclRefExpr 0x5210000754a0 '_Bool (B)' lvalue Function 0x521000075188 'g' '_Bool (B)'
> `-InitListExpr 0x52100009edc8 'B':'struct ExplicitThisInTemporary::B'
>   `-CXXDefaultInitExpr 0x52100009ee20 'B *' has rewritten init
>     `-CXXThisExpr 0x521000075008 'struct ExplicitThisInTemporary::B *' this
> ```
> 
> the `CXXThisExpr` here doesn't point to the current instance pointer of the frame (that doesn't even exist), but to the object created by the `InitListExpr` surrounding it (`0x52100009edc8`).

I believe that is correct. The `InitListExpr` is responsible for creating and initializing the `B` object (https://eel.is/c++draft/dcl.init#aggr-5) and `this` would refer to that object (https://eel.is/c++draft/expr.prim.this#4).

CC @zygoloid @hubert-reinterpretcast @cor3ntin @shafik for some additional opinions.

https://github.com/llvm/llvm-project/pull/106552


More information about the cfe-commits mailing list