ilya-biryukov wrote:

@kadircet and I have spent some time on this. 

The `LValueExprEvaluator` decides to "defer" the evaluation of compound 
literals to conversions, but does this in a way that assumes the evaluation 
happens inside the same expression.
https://github.com/llvm/llvm-project/blob/6c561604336497cbeebc90f9066a9f474458a38d/clang/lib/AST/ExprConstant.cpp#L9127

When we end up storing this resulting `LValue` anywhere (e.g. inside the value 
of a global `VarDecl`), we simply store a pointer to this expression inside the 
initializer.

Then the following code sees the expression in various random contexts it 
didn't belong to (e.g. when calling a constructor that happens to use the 
global variable)
https://github.com/llvm/llvm-project/blob/6c561604336497cbeebc90f9066a9f474458a38d/clang/lib/AST/ExprConstant.cpp#L4585

We feel that the right fix would be to instead create a proper l-value with the 
right lifetime (either static or block scope, depending the rules for the 
compound literals) and remove the "defering" logic altogether. @kadircet is 
preparing the fix.

This should be enough to fix the crash and properly evaluate the compound 
literals, but probably won't address the FIXMEs mentioned above.

@AaronBallman thanks for the pointers, they were really helpful to figure this 
out.

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

Reply via email to