[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 11:20:15 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)) {
----------------
mariusdr wrote:
`DynamicType.isConstant()` would reject valid code like
```
struct A {
constexpr virtual void foo(int &a) {
a = 1;
}
};
constexpr int m() {
A b;
int a;
b.foo(a);
return a;
}
static_assert(m() == 1, "");
```
here `TypePtr.isStatic()` is false so `CheckConstant()` returns early but I'm not sure if it is sufficient to only check those two things.
https://github.com/llvm/llvm-project/pull/158502
More information about the cfe-commits
mailing list