From 3c12901385b4035065cb601e5ba4c5eb28c06d43 Mon Sep 17 00:00:00 2001 From: bruteforceboy Date: Mon, 24 Feb 2025 16:17:22 +0300 Subject: [PATCH] [CIR][CodeGen] Support return in TryOp --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 3 ++- clang/test/CIR/CodeGen/try-catch.cpp | 21 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 1feb631bfcdf..a226603d0cbe 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -684,7 +684,8 @@ def StoreOp : CIR_Op<"store", [ def ReturnOp : CIR_Op<"return", [ParentOneOf<["FuncOp", "ScopeOp", "IfOp", "SwitchOp", "DoWhileOp", - "WhileOp", "ForOp", "CaseOp"]>, + "WhileOp", "ForOp", "CaseOp", + "TryOp"]>, Terminator]> { let summary = "Return from function"; let description = [{ diff --git a/clang/test/CIR/CodeGen/try-catch.cpp b/clang/test/CIR/CodeGen/try-catch.cpp index 0bcca60549b9..570017f83553 100644 --- a/clang/test/CIR/CodeGen/try-catch.cpp +++ b/clang/test/CIR/CodeGen/try-catch.cpp @@ -128,3 +128,24 @@ void tc5() { // CHECK: cir.call exception @_Z3tc5v() : () -> () // CHECK: cir.yield // CHECK: }] + +// CHECK: cir.func @_Z3tc6v() +void tc6() { + int r = 1; + try { + return; + ++r; + } catch (...) { + } +} + +// CHECK: cir.scope { +// CHECK: cir.try { +// CHECK: cir.return +// CHECK: ^bb1: // no predecessors +// CHECK: %[[V2:.*]] = cir.load {{.*}} : !cir.ptr, !s32i +// CHECK: %[[V3:.*]] = cir.unary(inc, %[[V2]]) : !s32i, !s32i +// CHECK: cir.store %[[V3]], {{.*}} : !s32i, !cir.ptr +// CHECK: cir.yield +// CHECK: } +// CHECK: }