[clang] [clang][Interp] Fix discarded integral and floating casts (PR #77295)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 8 02:25:22 PST 2024
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/77295
We need to handle this at the CastExpr level.
>From 4cecdb9bf613e7c4f42d6e735324a6d155467551 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 8 Jan 2024 11:23:45 +0100
Subject: [PATCH] [clang][Interp] Fix discarded integral and floating casts
We need to handle this at the CastExpr level.
---
clang/lib/AST/Interp/ByteCodeExprGen.cpp | 7 +++++++
clang/test/AST/Interp/literals.cpp | 4 ++++
2 files changed, 11 insertions(+)
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index e6b3097a80d8f7..7f8bbe78732481 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -114,6 +114,8 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
}
case CK_FloatingCast: {
+ if (DiscardResult)
+ return this->discard(SubExpr);
if (!this->visit(SubExpr))
return false;
const auto *TargetSemantics = &Ctx.getFloatSemantics(CE->getType());
@@ -121,6 +123,8 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
}
case CK_IntegralToFloating: {
+ if (DiscardResult)
+ return this->discard(SubExpr);
std::optional<PrimType> FromT = classify(SubExpr->getType());
if (!FromT)
return false;
@@ -135,6 +139,9 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
case CK_FloatingToBoolean:
case CK_FloatingToIntegral: {
+ if (DiscardResult)
+ return this->discard(SubExpr);
+
std::optional<PrimType> ToT = classify(CE->getType());
if (!ToT)
diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp
index 85adfe551384d2..61825bc11438f6 100644
--- a/clang/test/AST/Interp/literals.cpp
+++ b/clang/test/AST/Interp/literals.cpp
@@ -1024,6 +1024,10 @@ namespace DiscardExprs {
__null;
__builtin_offsetof(A, a);
1,2;
+ (int)1.0;
+ (float)1;
+ (double)1.0f;
+ (signed)4u;
return 0;
}
More information about the cfe-commits
mailing list