[clang] 5f84b33 - [clang][bytecode] Fix discarding __builtin_bit_cast calls (#114926)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 5 02:05:27 PST 2024
Author: Timm Baeder
Date: 2024-11-05T11:05:23+01:00
New Revision: 5f84b332ec9fcb24d2e278aef511ac424e4aa3b9
URL: https://github.com/llvm/llvm-project/commit/5f84b332ec9fcb24d2e278aef511ac424e4aa3b9
DIFF: https://github.com/llvm/llvm-project/commit/5f84b332ec9fcb24d2e278aef511ac424e4aa3b9.diff
LOG: [clang][bytecode] Fix discarding __builtin_bit_cast calls (#114926)
Optionally prepare storage for the result and do the bitcast anyway, to
get the right diagnostic output.
Added:
Modified:
clang/lib/AST/ByteCode/Compiler.cpp
clang/test/AST/ByteCode/builtin-bit-cast.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 396213c7b2ae0e..7cf2519d6a71fb 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -6446,8 +6446,6 @@ bool Compiler<Emitter>::emitBuiltinBitCast(const CastExpr *E) {
QualType ToType = E->getType();
std::optional<PrimType> ToT = classify(ToType);
- assert(!DiscardResult && "Implement DiscardResult mode for bitcasts.");
-
if (ToType->isNullPtrType()) {
if (!this->discard(SubExpr))
return false;
@@ -6463,12 +6461,24 @@ bool Compiler<Emitter>::emitBuiltinBitCast(const CastExpr *E) {
}
assert(!ToType->isReferenceType());
+ // Prepare storage for the result in case we discard.
+ if (DiscardResult && !Initializing && !ToT) {
+ std::optional<unsigned> LocalIndex = allocateLocal(E);
+ if (!LocalIndex)
+ return false;
+ if (!this->emitGetPtrLocal(*LocalIndex, E))
+ return false;
+ }
+
// Get a pointer to the value-to-cast on the stack.
if (!this->visit(SubExpr))
return false;
- if (!ToT || ToT == PT_Ptr)
- return this->emitBitCastPtr(E);
+ if (!ToT || ToT == PT_Ptr) {
+ if (!this->emitBitCastPtr(E))
+ return false;
+ return DiscardResult ? this->emitPopPtr(E) : true;
+ }
assert(ToT);
const llvm::fltSemantics *TargetSemantics = nullptr;
diff --git a/clang/test/AST/ByteCode/builtin-bit-cast.cpp b/clang/test/AST/ByteCode/builtin-bit-cast.cpp
index 0c55155ec64a24..1834bb5dc89b2f 100644
--- a/clang/test/AST/ByteCode/builtin-bit-cast.cpp
+++ b/clang/test/AST/ByteCode/builtin-bit-cast.cpp
@@ -38,6 +38,13 @@ constexpr Init round_trip(const Init &init) {
return bit_cast<Init>(bit_cast<Intermediate>(init));
}
+
+namespace Discarding {
+ struct S { int a; };
+ constexpr int f = (__builtin_bit_cast(int, 2), 0);
+ constexpr int f2 = (__builtin_bit_cast(S, 2), 0);
+}
+
namespace std {
enum byte : unsigned char {};
} // namespace std
More information about the cfe-commits
mailing list