Author: Timm Bäder Date: 2023-03-31T15:54:44+02:00 New Revision: 8d2899acbcf1b8ce120bc219aeb30207d4422042
URL: https://github.com/llvm/llvm-project/commit/8d2899acbcf1b8ce120bc219aeb30207d4422042 DIFF: https://github.com/llvm/llvm-project/commit/8d2899acbcf1b8ce120bc219aeb30207d4422042.diff LOG: [clang][Interp] Handle TypeTraitExprs Differential Revision: https://reviews.llvm.org/D142448 Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/test/AST/Interp/literals.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 1b605a9e0927..733247787d76 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -897,6 +897,11 @@ bool ByteCodeExprGen<Emitter>::VisitCompoundLiteralExpr( return false; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitTypeTraitExpr(const TypeTraitExpr *E) { + return this->emitConstBool(E->getValue(), E); +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { if (E->containsErrors()) return false; diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h index 03d2eb87b5e1..4baf5d433c9e 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.h +++ b/clang/lib/AST/Interp/ByteCodeExprGen.h @@ -92,6 +92,7 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>, bool VisitExprWithCleanups(const ExprWithCleanups *E); bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); + bool VisitTypeTraitExpr(const TypeTraitExpr *E); protected: bool visitExpr(const Expr *E) override; diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index fc36c13ed07b..5883c1879b92 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -743,3 +743,26 @@ namespace CompoundLiterals { static_assert(get3() == 3, ""); #endif }; + +namespace TypeTraits { + static_assert(__is_trivial(int), ""); + static_assert(__is_trivial(float), ""); + static_assert(__is_trivial(E), ""); + struct S{}; + static_assert(__is_trivial(S), ""); + struct S2 { + S2() {} + }; + static_assert(!__is_trivial(S2), ""); + + template <typename T> + struct S3 { + constexpr bool foo() const { return __is_trivial(T); } + }; + struct T { + ~T() {} + }; + struct U {}; + static_assert(S3<U>{}.foo(), ""); + static_assert(!S3<T>{}.foo(), ""); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits