Author: Timm Bäder Date: 2023-04-06T10:52:01+02:00 New Revision: 70e5a2a94354fd7cec577d3e0c3892cc5e7ef07a
URL: https://github.com/llvm/llvm-project/commit/70e5a2a94354fd7cec577d3e0c3892cc5e7ef07a DIFF: https://github.com/llvm/llvm-project/commit/70e5a2a94354fd7cec577d3e0c3892cc5e7ef07a.diff LOG: [clang][Interp] Fix zero-initializing of floating types Differential Revision: https://reviews.llvm.org/D146788 Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/floats.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 3c0992e4fee0..6ced8ca4d07f 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -953,8 +953,10 @@ bool ByteCodeExprGen<Emitter>::visitZeroInitializer(PrimType T, const Expr *E) { return this->emitNullPtr(E); case PT_FnPtr: return this->emitNullFnPtr(E); - case PT_Float: - assert(false); + case PT_Float: { + return this->emitConstFloat( + APFloat::getZero(Ctx.getFloatSemantics(E->getType())), E); + } } llvm_unreachable("unknown primitive type"); } diff --git a/clang/test/AST/Interp/floats.cpp b/clang/test/AST/Interp/floats.cpp index 7b9328c4d118..3b392d3b6727 100644 --- a/clang/test/AST/Interp/floats.cpp +++ b/clang/test/AST/Interp/floats.cpp @@ -78,3 +78,17 @@ namespace compound { } static_assert(f2() == __FLT_MAX__, ""); } + +namespace ZeroInit { + template<typename FloatT> + struct A { + int a; + FloatT f; + }; + + constexpr A<float> a{12}; + static_assert(a.f == 0.0f); + + constexpr A<double> b{12}; + static_assert(a.f == 0.0); +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits