Author: Timm Bäder Date: 2024-02-13T15:01:17+01:00 New Revision: bb60c066a24eda6e6276fba9021cad85c4892343
URL: https://github.com/llvm/llvm-project/commit/bb60c066a24eda6e6276fba9021cad85c4892343 DIFF: https://github.com/llvm/llvm-project/commit/bb60c066a24eda6e6276fba9021cad85c4892343.diff LOG: [clang][Interp] Handle Requires- and ConceptSpecializationExprs Just emit their satisfaction state, which is what the current interpreter does as well. Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/test/SemaCXX/concept-crash-on-diagnostic.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 880e338224ddf9..91b9985eefbd30 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -2119,6 +2119,19 @@ bool ByteCodeExprGen<Emitter>::VisitCXXUuidofExpr(const CXXUuidofExpr *E) { return this->emitInitPtr(E); } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitRequiresExpr(const RequiresExpr *E) { + assert(classifyPrim(E->getType()) == PT_Bool); + return this->emitConstBool(E->isSatisfied(), E); +} + +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitConceptSpecializationExpr( + const ConceptSpecializationExpr *E) { + assert(classifyPrim(E->getType()) == PT_Bool); + return this->emitConstBool(E->isSatisfied(), 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 c723170110c557..eeb56dc8456565 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.h +++ b/clang/lib/AST/Interp/ByteCodeExprGen.h @@ -114,6 +114,8 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>, bool VisitCXXInheritedCtorInitExpr(const CXXInheritedCtorInitExpr *E); bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E); bool VisitCXXUuidofExpr(const CXXUuidofExpr *E); + bool VisitRequiresExpr(const RequiresExpr *E); + bool VisitConceptSpecializationExpr(const ConceptSpecializationExpr *E); protected: bool visitExpr(const Expr *E) override; diff --git a/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp b/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp index 00a39f9f03b79c..71e55c8290ee4a 100644 --- a/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp +++ b/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s +// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s -fexperimental-new-constant-interpreter template <typename Iterator> class normal_iterator {}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits