martinboehme wrote:

> > As an initial comment, wanted to confirm that we've clarified what the 
> > semantics of the AST are here.
> > In #128068, I asked:
> > > What I'm not clear on is what the rule is that disambiguates this. Is it 
> > > simply that if a `CXXThisExpr` is contained in an `InitListExpr`, it 
> > > refers to the result object of that `InitListExpr` (and not the this 
> > > pointer of the enclosing `CXXMethodDecl`)?
> > 
> > 
> > Have you been able to get a definitive clarification on this?
> 
> @yronglin chimed in at [#128068 
> (comment)](https://github.com/llvm/llvm-project/issues/128068#issuecomment-3013510399)
>  but haven't heard from others beyond that.
> 
> What I see in the code / debugger is like that, involving 
> `CXXDefaultInitExpr`: "if a `CXXThisExpr` is contained in an 
> `CXXDefaultInitExpr` in an `InitListExpr` (or `CXXParenListInitExpr`) (and 
> not the...)".
> 
> * while parsing and building an `InitListExpr` (one example is around 
> [here](https://github.com/llvm/llvm-project/blob/ace3d3002ff465d433dce526ad3b641170a3dda7/clang/lib/Parse/ParseExprCXX.cpp#L1799-L1805))
> * it will eventually hit 
> `FillInEmptyInitForField`[here](https://github.com/llvm/llvm-project/blob/e933cfcfb2d207a7ff63cf152a7a78555d431d49/clang/lib/Sema/SemaInit.cpp#L804-L824)
> * and `BuildCXXDefaultInitExpr` will have an 
> [`CXXThisScopeRAII`](https://github.com/llvm/llvm-project/blob/dc8e89b2b3787defa9ef1d72014c8a68c1b09a5f/clang/lib/Sema/SemaExpr.cpp#L5650)
>  which sets  
> [`CXXThisTypeOverride`](https://github.com/llvm/llvm-project/blob/dc8e89b2b3787defa9ef1d72014c8a68c1b09a5f/clang/lib/Sema/SemaExprCXX.cpp#L1251)
>  with the `Field->getParent()`'s type
> 
> similarly, there's some CodeGen code that prepares for a different `this` for 
> fields 
> [here](https://github.com/llvm/llvm-project/blob/ace3d3002ff465d433dce526ad3b641170a3dda7/clang/lib/CodeGen/CGExprAgg.cpp#L1845)
>  using 
> [`FieldConstructionScope`](https://github.com/llvm/llvm-project/blob/ace3d3002ff465d433dce526ad3b641170a3dda7/clang/lib/CodeGen/CodeGenFunction.h#L1759)
>  based on the slot for the InitListExpr [from 
> here](https://github.com/llvm/llvm-project/blob/ace3d3002ff465d433dce526ad3b641170a3dda7/clang/lib/CodeGen/CGExprAgg.cpp#L1785)
> 
> If the `CXXThisExpr` is not under an `CXXDefaultInitExpr`, then you use the 
> "previous" this. [Example](https://godbolt.org/z/KdMno4qWf) where `this` for 
> `x` is type `Foo*` but `this` for `i` is `Other*`.

Sorry for the late reply -- was busy with other things.

Thanks for gathering these references. I haven't looked at everything in 
detail, but this looks persuasive. However, I wonder if we could get some 
confirmation from a person who has worked with this code themselves -- maybe 
ask in the Clang Frontend section of the Clang forum?

https://github.com/llvm/llvm-project/pull/146900
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to