[clang] 09cd5a8 - [clang][bytecode] Refuse to contruct objects with virtual bases (#110142)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 26 20:56:16 PDT 2024
Author: Timm Baeder
Date: 2024-09-27T05:56:12+02:00
New Revision: 09cd5a86733a362f12542a11ffd834cac885eb32
URL: https://github.com/llvm/llvm-project/commit/09cd5a86733a362f12542a11ffd834cac885eb32
DIFF: https://github.com/llvm/llvm-project/commit/09cd5a86733a362f12542a11ffd834cac885eb32.diff
LOG: [clang][bytecode] Refuse to contruct objects with virtual bases (#110142)
Added:
Modified:
clang/lib/AST/ByteCode/Interp.cpp
clang/test/AST/ByteCode/cxx23.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 2f4a05a85753c0..c43f64901909ce 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1043,6 +1043,25 @@ bool CheckLiteralType(InterpState &S, CodePtr OpPC, const Type *T) {
return false;
}
+static bool checkConstructor(InterpState &S, CodePtr OpPC, const Function *Func,
+ const Pointer &ThisPtr) {
+ assert(Func->isConstructor());
+
+ const Descriptor *D = ThisPtr.getFieldDesc();
+
+ // FIXME: I think this case is not 100% correct. E.g. a pointer into a
+ // subobject of a composite array.
+ if (!D->ElemRecord)
+ return true;
+
+ if (D->ElemRecord->getNumVirtualBases() == 0)
+ return true;
+
+ S.FFDiag(S.Current->getLocation(OpPC), diag::note_constexpr_virtual_base)
+ << Func->getParentDecl();
+ return false;
+}
+
bool CallVar(InterpState &S, CodePtr OpPC, const Function *Func,
uint32_t VarArgSize) {
if (Func->hasThisPointer()) {
@@ -1117,6 +1136,9 @@ bool Call(InterpState &S, CodePtr OpPC, const Function *Func,
if (!CheckInvoke(S, OpPC, ThisPtr))
return cleanup();
}
+
+ if (Func->isConstructor() && !checkConstructor(S, OpPC, Func, ThisPtr))
+ return false;
}
if (!CheckCallable(S, OpPC, Func))
diff --git a/clang/test/AST/ByteCode/cxx23.cpp b/clang/test/AST/ByteCode/cxx23.cpp
index 3c50c8927304c0..1803fb8ab2e9a4 100644
--- a/clang/test/AST/ByteCode/cxx23.cpp
+++ b/clang/test/AST/ByteCode/cxx23.cpp
@@ -158,6 +158,21 @@ namespace VirtualBases {
/// Calls the constructor of D.
D d;
}
+
+#if __cplusplus >= 202302L
+ struct VBase {};
+ struct HasVBase : virtual VBase {}; // all23-note 1{{virtual base class declared here}}
+ struct Derived : HasVBase {
+ constexpr Derived() {} // all23-error {{constexpr constructor not allowed in struct with virtual base class}}
+ };
+ template<typename T> struct DerivedFromVBase : T {
+ constexpr DerivedFromVBase();
+ };
+ constexpr int f(DerivedFromVBase<HasVBase>) {}
+ template<typename T> constexpr DerivedFromVBase<T>::DerivedFromVBase() : T() {}
+ constexpr int nVBase = (DerivedFromVBase<HasVBase>(), 0); // all23-error {{constant expression}} \
+ // all23-note {{cannot construct object of type 'DerivedFromVBase<VirtualBases::HasVBase>' with virtual base class in a constant expression}}
+#endif
}
namespace LabelGoto {
More information about the cfe-commits
mailing list