[PATCH] D132739: [clang][Interp] Implement IntegralToBoolean casts
Timm Bäder via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 26 06:41:56 PDT 2022
tbaeder created this revision.
tbaeder added reviewers: aaron.ballman, erichkeane, shafik, tahonermann.
Herald added a subscriber: inglorion.
Herald added a project: All.
tbaeder requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Redo how we do IntegralCasts and implement IntegralToBoolean casts using the already existing cast op.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D132739
Files:
clang/lib/AST/Interp/Boolean.h
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/lib/AST/Interp/Opcodes.td
clang/test/AST/Interp/literals.cpp
Index: clang/test/AST/Interp/literals.cpp
===================================================================
--- clang/test/AST/Interp/literals.cpp
+++ clang/test/AST/Interp/literals.cpp
@@ -14,6 +14,11 @@
// expected-note{{evaluates to}} \
// ref-note{{evaluates to}}
+constexpr bool b = number;
+static_assert(b, "");
+constexpr int one = true;
+static_assert(one == 1, "");
+
constexpr bool getTrue() { return true; }
constexpr bool getFalse() { return false; }
constexpr void* getNull() { return nullptr; }
Index: clang/lib/AST/Interp/Opcodes.td
===================================================================
--- clang/lib/AST/Interp/Opcodes.td
+++ clang/lib/AST/Interp/Opcodes.td
@@ -425,12 +425,16 @@
//===----------------------------------------------------------------------===//
// TODO: Expand this to handle casts between more types.
-def Sint32TypeClass : TypeClass {
- let Types = [Sint32];
+def FromCastTypeClass : TypeClass {
+ let Types = [Sint32, Bool];
+}
+
+def ToCastTypeClass : TypeClass {
+ let Types = [Sint32, Bool];
}
def Cast: Opcode {
- let Types = [BoolTypeClass, Sint32TypeClass];
+ let Types = [FromCastTypeClass, ToCastTypeClass];
let HasGroup = 1;
}
Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp
===================================================================
--- clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -117,6 +117,7 @@
case CK_NullToPointer:
return this->Visit(SubExpr);
+ case CK_IntegralToBoolean:
case CK_IntegralCast: {
Optional<PrimType> FromT = classify(SubExpr->getType());
Optional<PrimType> ToT = classify(CE->getType());
@@ -132,19 +133,6 @@
case CK_ToVoid:
return discard(SubExpr);
- case CK_IntegralToBoolean:
- // Compare integral from Subexpr with 0
- if (Optional<PrimType> T = classify(SubExpr->getType())) {
- if (!this->Visit(SubExpr))
- return false;
-
- if (!this->emitConst(SubExpr, 0))
- return false;
-
- return this->emitNE(*T, SubExpr);
- }
- return false;
-
default:
assert(false && "Cast not implemented");
}
Index: clang/lib/AST/Interp/Boolean.h
===================================================================
--- clang/lib/AST/Interp/Boolean.h
+++ clang/lib/AST/Interp/Boolean.h
@@ -50,6 +50,7 @@
explicit operator int64_t() const { return V; }
explicit operator uint64_t() const { return V; }
explicit operator int() const { return V; }
+ explicit operator bool() const { return V; }
APSInt toAPSInt() const {
return APSInt(APInt(1, static_cast<uint64_t>(V), false), true);
@@ -85,9 +86,10 @@
static Boolean min(unsigned NumBits) { return Boolean(false); }
static Boolean max(unsigned NumBits) { return Boolean(true); }
- template <typename T>
- static std::enable_if_t<std::is_integral<T>::value, Boolean> from(T Value) {
- return Boolean(Value != 0);
+ template <typename T> static Boolean from(T Value) {
+ if constexpr (std::is_integral<T>::value)
+ return Boolean(Value != 0);
+ return Boolean(static_cast<decltype(Boolean::V)>(Value) != 0);
}
template <unsigned SrcBits, bool SrcSign>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D132739.455892.patch
Type: text/x-patch
Size: 3252 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220826/26b0273c/attachment-0001.bin>
More information about the cfe-commits
mailing list