================
@@ -789,9 +789,10 @@ void AggExprEmitter::VisitOpaqueValueExpr(OpaqueValueExpr 
*e) {
 }
 
 void AggExprEmitter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
-  if (Dest.isPotentiallyAliased()) {
-    // Just emit a load of the lvalue + a copy, because our compound literal
-    // might alias the destination.
+  if (E->hasGlobalStorage() || E->getType()->isAtomicType() ||
+      (E->getStorageClass() == SC_Register &&
+       E->getType().isVolatileQualified()) ||
----------------
a-tarasyuk wrote:

I revised the condition to:

```cpp
Dest.isPotentiallyAliased() || E->hasGlobalStorage() ||
Ty->isAtomicType() || Ty.isVolatileQualified()
```

I don’t think there is a single spec paragraph that lists these conditions 😄. 
My reading of `6.5.3.6` `p5`, `p7`, and `p8` is 

`6.5.3.6` `p5` and `p7` require a `static`/`thread` compound literal to use its 
unnamed object., emitting the initializer directly into Dest would bypass that 
object.

`6.5.3.6` `p8` makes the expression an `lvalue`, and together with `6.3.2.1`, 
it appears to imply that obtaining the value of an `atomic` or `volatile` 
aggregate literal should preserve the access semantics, which directly 
initializing `Dest` would bypass - or am I mistaken here?






https://github.com/llvm/llvm-project/pull/212559
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to