This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGc9e403d1992b: [clang][Interp] Fix zero-init of float and pointer arrays (authored by tbaeder).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D149059/new/ https://reviews.llvm.org/D149059 Files: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/arrays.cpp Index: clang/test/AST/Interp/arrays.cpp =================================================================== --- clang/test/AST/Interp/arrays.cpp +++ clang/test/AST/Interp/arrays.cpp @@ -334,3 +334,19 @@ // ref-error {{not an integral constant expression}} \ // ref-note {{in call to}} }; + +namespace ZeroInit { + struct A { + int *p[2]; + }; + constexpr A a = {}; + static_assert(a.p[0] == nullptr, ""); + static_assert(a.p[1] == nullptr, ""); + + struct B { + double f[2]; + }; + constexpr B b = {}; + static_assert(b.f[0] == 0.0, ""); + static_assert(b.f[1] == 0.0, ""); +} Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1291,7 +1291,7 @@ // since we memset our Block*s to 0 and so we have the desired value // without this. for (size_t I = 0; I != NumElems; ++I) { - if (!this->emitZero(*ElemT, Initializer)) + if (!this->visitZeroInitializer(CAT->getElementType(), Initializer)) return false; if (!this->emitInitElem(*ElemT, I, Initializer)) return false;
Index: clang/test/AST/Interp/arrays.cpp =================================================================== --- clang/test/AST/Interp/arrays.cpp +++ clang/test/AST/Interp/arrays.cpp @@ -334,3 +334,19 @@ // ref-error {{not an integral constant expression}} \ // ref-note {{in call to}} }; + +namespace ZeroInit { + struct A { + int *p[2]; + }; + constexpr A a = {}; + static_assert(a.p[0] == nullptr, ""); + static_assert(a.p[1] == nullptr, ""); + + struct B { + double f[2]; + }; + constexpr B b = {}; + static_assert(b.f[0] == 0.0, ""); + static_assert(b.f[1] == 0.0, ""); +} Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1291,7 +1291,7 @@ // since we memset our Block*s to 0 and so we have the desired value // without this. for (size_t I = 0; I != NumElems; ++I) { - if (!this->emitZero(*ElemT, Initializer)) + if (!this->visitZeroInitializer(CAT->getElementType(), Initializer)) return false; if (!this->emitInitElem(*ElemT, I, Initializer)) return false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits