[clang] [clang][Interp] Only evaluate the source array initialization of an `ArrayInitLoopExpr` once (PR #68039)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 18 23:20:03 PDT 2023
================
@@ -847,7 +845,33 @@ template <class Emitter>
bool ByteCodeExprGen<Emitter>::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
if (Initializing)
return this->visitInitializer(E->getSourceExpr());
- return this->visit(E->getSourceExpr());
+
+ PrimType CacheVariableTy = classify(E).value_or(PT_Ptr);
+ if (OpaqueExprs.contains(E))
+ return this->emitGetLocal(CacheVariableTy, OpaqueExprs[E], E);
+
+ if (!this->visit(E->getSourceExpr()))
+ return false;
+
+ // At this point we either have the evaluated source expression or a pointer
+ // to an object on the stack. We want to create a local variable that stores
+ // this value.
+ std::optional<unsigned> LocalIndex =
+ allocateLocalPrimitive(E, CacheVariableTy, true);
----------------
tbaederr wrote:
```suggestion
allocateLocalPrimitive(E, CacheVariableTy, /*IsConst=*/true);
```
https://github.com/llvm/llvm-project/pull/68039
More information about the cfe-commits
mailing list