================
@@ -2566,11 +2566,13 @@
RegionStoreManager::setImplicitDefaultValue(LimitedRegionBindingsConstRef B,
if (B.hasExhaustedBindingLimit())
return B;
- // Prefer to keep the previous default binding if we had one; that is likely
a
- // better choice than setting some arbitrary new default value.
- // This isn't ideal (more of a hack), but better than dropping the more
- // accurate default binding.
- if (B.getDefaultBinding(R).has_value()) {
+ // Preserve an existing aggregate default binding. This handles partially
+ // initialized union-containing aggregates where bindAggregate() may already
+ // have installed a more precise default value at offset 0. Still allow
+ // implicit defaults for scalars and pointers so regular zero-initialization
+ // continues to work, e.g. for `new int[10]{}`.
+ if ((T->isStructureOrClassType() || T->isArrayType() || T->isUnionType()) &&
----------------
chandmudda wrote:
Thank you, that is a better fit here. The explicit disjunction is broader for
C++ record types, while `isAggregateType()` matches the intent expressed in the
comment more closely. I will switch to `isAggregateType()`.
https://github.com/llvm/llvm-project/pull/189319
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits