[clang] 49b760f - [clang][Interp] Fix calling virtual CXXOperatorCallExprs
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Mon May 27 07:01:42 PDT 2024
Author: Timm Bäder
Date: 2024-05-27T16:01:30+02:00
New Revision: 49b760ff2c7da60f4308708f56688ca99874605f
URL: https://github.com/llvm/llvm-project/commit/49b760ff2c7da60f4308708f56688ca99874605f
DIFF: https://github.com/llvm/llvm-project/commit/49b760ff2c7da60f4308708f56688ca99874605f.diff
LOG: [clang][Interp] Fix calling virtual CXXOperatorCallExprs
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/AST/Interp/records.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 37c45e4311afb..3eb7e7544df71 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3341,7 +3341,8 @@ bool ByteCodeExprGen<Emitter>::VisitCallExpr(const CallExpr *E) {
// write the result into.
if (IsVirtual && !HasQualifier) {
uint32_t VarArgSize = 0;
- unsigned NumParams = Func->getNumWrittenParams();
+ unsigned NumParams =
+ Func->getNumWrittenParams() + isa<CXXOperatorCallExpr>(E);
for (unsigned I = NumParams, N = E->getNumArgs(); I != N; ++I)
VarArgSize += align(primSize(classify(E->getArg(I)).value_or(PT_Ptr)));
diff --git a/clang/test/AST/Interp/records.cpp b/clang/test/AST/Interp/records.cpp
index 97ac3e9169555..0a89c81bafd57 100644
--- a/clang/test/AST/Interp/records.cpp
+++ b/clang/test/AST/Interp/records.cpp
@@ -1467,3 +1467,16 @@ namespace IgnoredCtorWithZeroInit {
return (S(), true);
}
}
+
+#if __cplusplus >= 202002L
+namespace VirtOperator {
+ /// This used to crash because it's a virtual CXXOperatorCallExpr.
+ struct B {
+ virtual constexpr bool operator==(const B&) const { return true; }
+ };
+ struct D : B {
+ constexpr bool operator==(const B&) const override{ return false; } // both-note {{operator}}
+ };
+ constexpr bool cmp_base_derived = D() == D(); // both-warning {{ambiguous}}
+}
+#endif
More information about the cfe-commits
mailing list