https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/70584
Just do the same thing the current interpreter does: Ignore all handlerrs and visit the try block like normal. >From 0c0172a334a4484b4c1fa0d784fa7042e2fe805d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Sun, 29 Oct 2023 07:44:55 +0100 Subject: [PATCH] [clang][Interp] Handle CXXTryStmts Just do the same thing the current interpreter does: Ignore all handlerrs and visit the try block like normal. --- clang/lib/AST/Interp/ByteCodeStmtGen.cpp | 8 ++++++++ clang/lib/AST/Interp/ByteCodeStmtGen.h | 1 + clang/test/AST/Interp/cxx20.cpp | 13 +++++++++++++ 3 files changed, 22 insertions(+) diff --git a/clang/lib/AST/Interp/ByteCodeStmtGen.cpp b/clang/lib/AST/Interp/ByteCodeStmtGen.cpp index 509abe3ae867f93..b1ab5fcf9cb64c3 100644 --- a/clang/lib/AST/Interp/ByteCodeStmtGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeStmtGen.cpp @@ -255,6 +255,8 @@ bool ByteCodeStmtGen<Emitter>::visitStmt(const Stmt *S) { return visitAsmStmt(cast<AsmStmt>(S)); case Stmt::AttributedStmtClass: return visitAttributedStmt(cast<AttributedStmt>(S)); + case Stmt::CXXTryStmtClass: + return visitCXXTryStmt(cast<CXXTryStmt>(S)); case Stmt::NullStmtClass: return true; default: { @@ -643,6 +645,12 @@ bool ByteCodeStmtGen<Emitter>::visitAttributedStmt(const AttributedStmt *S) { return this->visitStmt(S->getSubStmt()); } +template <class Emitter> +bool ByteCodeStmtGen<Emitter>::visitCXXTryStmt(const CXXTryStmt *S) { + // Ignore all handlers. + return this->visitStmt(S->getTryBlock()); +} + namespace clang { namespace interp { diff --git a/clang/lib/AST/Interp/ByteCodeStmtGen.h b/clang/lib/AST/Interp/ByteCodeStmtGen.h index 31f9dbb8064c73c..64e03587ab2112d 100644 --- a/clang/lib/AST/Interp/ByteCodeStmtGen.h +++ b/clang/lib/AST/Interp/ByteCodeStmtGen.h @@ -65,6 +65,7 @@ class ByteCodeStmtGen final : public ByteCodeExprGen<Emitter> { bool visitDefaultStmt(const DefaultStmt *S); bool visitAsmStmt(const AsmStmt *S); bool visitAttributedStmt(const AttributedStmt *S); + bool visitCXXTryStmt(const CXXTryStmt *S); bool emitLambdaStaticInvokerBody(const CXXMethodDecl *MD); diff --git a/clang/test/AST/Interp/cxx20.cpp b/clang/test/AST/Interp/cxx20.cpp index f0bb4e9e0d0711b..50a7c02925878d5 100644 --- a/clang/test/AST/Interp/cxx20.cpp +++ b/clang/test/AST/Interp/cxx20.cpp @@ -739,3 +739,16 @@ namespace NonPrimitiveOpaqueValue static_assert(!ternary(), ""); } + +namespace TryCatch { + constexpr int foo() { + int a = 10; + try { + ++a; + } catch(int m) { + --a; + } + return a; + } + static_assert(foo() == 11); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits