This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. tbaeder marked an inline comment as done. Closed by commit rG95e6a407d92b: [clang][Interp] Implement IntegralToBoolean casts (authored by tbaeder).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D132739/new/ 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,37 @@ // expected-note{{evaluates to}} \ // ref-note{{evaluates to}} +constexpr bool b = number; +static_assert(b, ""); +constexpr int one = true; +static_assert(one == 1, ""); + +namespace IntegralCasts { + constexpr int i = 12; + constexpr unsigned int ui = i; + static_assert(ui == 12, ""); + constexpr unsigned int ub = !false; + static_assert(ub == 1, ""); + + constexpr int si = ui; + static_assert(si == 12, ""); + constexpr int sb = true; + static_assert(sb == 1, ""); + + constexpr int zero = 0; + constexpr unsigned int uzero = 0; + constexpr bool bs = i; + static_assert(bs, ""); + constexpr bool bu = ui; + static_assert(bu, ""); + constexpr bool ns = zero; + static_assert(!ns, ""); + constexpr bool nu = uzero; + static_assert(!nu, ""); +}; + + + 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 = [Uint32, Sint32, Bool]; +} + +def ToCastTypeClass : TypeClass { + let Types = [Uint32, 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>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits