[clang] [clang][bytecode] Assert on virtual func call from array elem (PR #158502)

marius doerner via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 23 10:18:10 PDT 2025


Marius =?utf-8?q?Dörner?= <marius.doerner1 at icloud.com>,
Marius =?utf-8?q?Dörner?= <marius.doerner1 at icloud.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/158502 at github.com>


================
@@ -1636,6 +1639,33 @@ bool Call(InterpState &S, CodePtr OpPC, const Function *Func,
   return true;
 }
 
+static bool GetDynamicDecl(InterpState &S, CodePtr OpPC, Pointer TypePtr,
+                           const CXXRecordDecl *&DynamicDecl) {
+  while (TypePtr.isBaseClass())
+    TypePtr = TypePtr.getBase();
+
+  QualType DynamicType = TypePtr.getType();
+  if (DynamicType->isPointerType() || DynamicType->isReferenceType()) {
+    DynamicDecl = DynamicType->getPointeeCXXRecordDecl();
+  } else if (DynamicType->isArrayType()) {
+    const Type *ElemType = DynamicType->getPointeeOrArrayElementType();
+    assert(ElemType);
+    DynamicDecl = ElemType->getAsCXXRecordDecl();
+  } else {
+    DynamicDecl = DynamicType->getAsCXXRecordDecl();
+  }
+
+  if (!CheckConstant(S, OpPC, TypePtr, true)) {
+    const Expr *E = S.Current->getExpr(OpPC);
+    APValue V = TypePtr.toAPValue(S.getASTContext());
+    QualType TT = S.getASTContext().getLValueReferenceType(DynamicType);
----------------
mariusdr wrote:

The output is slightly different because toDiagnosticString() (~ APValue::getAsString(V, TypePtr.getType()) adds a '&' prefix to the output while the code above does not, because the input QualType is not a reference type ref:

https://github.com/llvm/llvm-project/blob/6a7aec12ad359476c2c4dadce05dfef384187901/clang/lib/AST/APValue.cpp#L819-L821

we would get messages like

```
note: virtual function called on object '&k' whose dynamic type is not constant
```

while the other interpreter outputs 

```
note: virtual function called on object 'k' whose dynamic type is not constant
```

https://github.com/llvm/llvm-project/pull/158502


More information about the cfe-commits mailing list