[PATCH] D152548: [Clang][Interp] Diagnose uninitialized ctor of global record arrays
Takuya Shimizu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 19 00:45:18 PDT 2023
hazohelet updated this revision to Diff 532554.
hazohelet marked an inline comment as done.
hazohelet added a comment.
Address comment from @tbaeder
- NFC stylistic change in test
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D152548/new/
https://reviews.llvm.org/D152548
Files:
clang/lib/AST/Interp/ByteCodeExprGen.h
clang/lib/AST/Interp/Interp.cpp
clang/test/AST/Interp/cxx20.cpp
Index: clang/test/AST/Interp/cxx20.cpp
===================================================================
--- clang/test/AST/Interp/cxx20.cpp
+++ clang/test/AST/Interp/cxx20.cpp
@@ -138,14 +138,43 @@
namespace UninitializedFields {
class A {
public:
- int a; // expected-note 3{{subobject declared here}} \
- // ref-note 3{{subobject declared here}}
+ int a; // expected-note 4{{subobject declared here}} \
+ // ref-note 4{{subobject declared here}}
constexpr A() {}
};
constexpr A a; // expected-error {{must be initialized by a constant expression}} \
// expected-note {{subobject 'a' is not initialized}} \
// ref-error {{must be initialized by a constant expression}} \
// ref-note {{subobject 'a' is not initialized}}
+ constexpr A aarr[2]; // expected-error {{must be initialized by a constant expression}} \
+ // expected-note {{subobject 'a' is not initialized}} \
+ // ref-error {{must be initialized by a constant expression}} \
+ // ref-note {{subobject 'a' is not initialized}}
+ class F {
+ public:
+ int f; // expected-note 3{{subobject declared here}} \
+ // ref-note 3{{subobject declared here}}
+
+ constexpr F() {}
+ constexpr F(bool b) {
+ if (b)
+ f = 42;
+ }
+ };
+
+ constexpr F foo[2] = {true}; // expected-error {{must be initialized by a constant expression}} \
+ // expected-note {{subobject 'f' is not initialized}} \
+ // ref-error {{must be initialized by a constant expression}} \
+ // ref-note {{subobject 'f' is not initialized}}
+ constexpr F foo2[3] = {true, false, true}; // expected-error {{must be initialized by a constant expression}} \
+ // expected-note {{subobject 'f' is not initialized}} \
+ // ref-error {{must be initialized by a constant expression}} \
+ // ref-note {{subobject 'f' is not initialized}}
+ constexpr F foo3[3] = {true, true, F()}; // expected-error {{must be initialized by a constant expression}} \
+ // expected-note {{subobject 'f' is not initialized}} \
+ // ref-error {{must be initialized by a constant expression}} \
+ // ref-note {{subobject 'f' is not initialized}}
+
class Base {
Index: clang/lib/AST/Interp/Interp.cpp
===================================================================
--- clang/lib/AST/Interp/Interp.cpp
+++ clang/lib/AST/Interp/Interp.cpp
@@ -456,8 +456,11 @@
bool CheckCtorCall(InterpState &S, CodePtr OpPC, const Pointer &This) {
assert(!This.isZero());
- const Record *R = This.getRecord();
- return CheckFieldsInitialized(S, OpPC, This, R);
+ if (const Record *R = This.getRecord())
+ return CheckFieldsInitialized(S, OpPC, This, R);
+ const auto *CAT =
+ cast<ConstantArrayType>(This.getType()->getAsArrayTypeUnsafe());
+ return CheckArrayInitialized(S, OpPC, This, CAT);
}
bool CheckFloatResult(InterpState &S, CodePtr OpPC, APFloat::opStatus Status) {
Index: clang/lib/AST/Interp/ByteCodeExprGen.h
===================================================================
--- clang/lib/AST/Interp/ByteCodeExprGen.h
+++ clang/lib/AST/Interp/ByteCodeExprGen.h
@@ -166,7 +166,8 @@
if (!visitInitializer(Init))
return false;
- if (Init->getType()->isRecordType() && !this->emitCheckGlobalCtor(Init))
+ if ((Init->getType()->isArrayType() || Init->getType()->isRecordType()) &&
+ !this->emitCheckGlobalCtor(Init))
return false;
return this->emitPopPtr(Init);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D152548.532554.patch
Type: text/x-patch
Size: 3889 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230619/67bc7054/attachment.bin>
More information about the cfe-commits
mailing list