[PATCH] D136751: [clang][Interp] This pointers are writable in constructors
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 28 11:52:01 PST 2023
aaron.ballman added inline comments.
================
Comment at: clang/lib/AST/Interp/Interp.cpp:221-225
+ if (const Function *Func = S.Current->getFunction();
+ Func && (Func->isConstructor() || Func->isDestructor())) {
+ if (Ptr.block() == S.Current->getThis().block())
+ return true;
}
----------------
Combining predicates; NFC
================
Comment at: clang/test/AST/Interp/cxx20.cpp:221-230
+ class FooDtor {
+ int a;
+ public:
+ constexpr FooDtor() {
+ this->a = 10;
+ }
+ constexpr ~FooDtor() {
----------------
I'd feel more comfortable if we had some way to validate that the write to `a` in both of these cases actually caused the correct value to appear in `a`. We're just validating that this compiles and doesn't crash, but we're not validating that the actual behavior occurs. How about adding tests like:
```
template <bool Good>
struct ctor_test {
int a = 0;
constexpr ctor_test() {
if (Good)
a = 10;
int local = 100 / a;
}
};
template <bool Good>
struct dtor_test {
int a = 0;
constexpr dtor_test() = default;
constexpr ~dtor_test() {
if (Good)
a = 10;
int local = 100 / a;
}
};
constexpr ctor_test<true> good_ctor;
constexpr dtor_test<true> good_dtor;
constexpr ctor_test<false> bad_ctor;
constexpr dtor_test<false> bad_dtor;
```
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D136751/new/
https://reviews.llvm.org/D136751
More information about the cfe-commits
mailing list