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

Reply via email to