diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 74ed436bdb544b..2fdc6f4f32bed9 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -2156,6 +2156,12 @@ bool ByteCodeExprGen::VisitConceptSpecializationExpr( return this->emitConstBool(E->isSatisfied(), E); } +template +bool ByteCodeExprGen::VisitCXXRewrittenBinaryOperator( + const CXXRewrittenBinaryOperator *E) { + return this->delegate(E->getSemanticForm()); +} + template bool ByteCodeExprGen::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 abaf28ac7d447d..3ede86a6979eea 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.h +++ b/clang/lib/AST/Interp/ByteCodeExprGen.h @@ -116,6 +116,7 @@ class ByteCodeExprGen : public ConstStmtVisitor, bool>, bool VisitCXXUuidofExpr(const CXXUuidofExpr *E); bool VisitRequiresExpr(const RequiresExpr *E); bool VisitConceptSpecializationExpr(const ConceptSpecializationExpr *E); + bool VisitCXXRewrittenBinaryOperator(const CXXRewrittenBinaryOperator *E); protected: bool visitExpr(const Expr *E) override; diff --git a/clang/test/AST/Interp/cxx20.cpp b/clang/test/AST/Interp/cxx20.cpp index 0fc5d977b59f4c..78c09661c6dd73 100644 --- a/clang/test/AST/Interp/cxx20.cpp +++ b/clang/test/AST/Interp/cxx20.cpp @@ -763,3 +763,16 @@ namespace IgnoredConstantExpr { ReferenceToNestedMembers j{0}; } test_reference_to_nested_members; } + +namespace RewrittenBinaryOperators { + template + struct Conv { + constexpr operator T() const { return Val; } + operator T() { return Val; } + }; + + struct X { + constexpr const Conv operator<=>(X) { return {}; } + }; + static_assert(X() < X(), ""); +}