Timm =?utf-8?q?Bäder?= <[email protected]>,
Timm =?utf-8?q?Bäder?= <[email protected]>,
Timm =?utf-8?q?Bäder?= <[email protected]>,
Timm =?utf-8?q?Bäder?= <[email protected]>,
Timm =?utf-8?q?Bäder?= <[email protected]>,
Timm =?utf-8?q?Bäder?= <[email protected]>,
Timm =?utf-8?q?Bäder?= <[email protected]>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/[email protected]>
================
@@ -7123,10 +7241,13 @@ static bool HandleConstructorCall(const Expr *E, const
LValue &This,
// Reserve space for the struct members.
if (!Result.hasValue()) {
- if (!RD->isUnion())
- Result = APValue(APValue::UninitStruct(), RD->getNumBases(),
- RD->getNumFields());
- else
+ if (!RD->isUnion()) {
+ unsigned NonVirtualBases =
+ llvm::count_if(RD->bases(), [](auto &B) { return !B.isVirtual(); });
----------------
tbaederr wrote:
No; `bases()` includes both non-virtual bases and explicitly specified virtual
bases, e.g. in `struct S : A, B C, virtual D, virtual E {}` we have 5 entries
in `bases()` and 2 in `vbases()`, but `vbases()` also includes bases pulled
down from transitive base classes:
```c++
struct A {};
struct B : virtual A {}; // bases=1, vbases=1
struct C : virtual C{}; // bases=1, vbases=1
struct D : B, C {}; // bases=2, vbases=2
```
Seems like this would only be useful in `ExprConstant.cpp` so far, so dunno.
```
https://github.com/llvm/llvm-project/pull/204289
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits