Skip to content

Commit fad1fd1

Browse files
authored
[CIR][CodeGen] Support FullExpression storage duration cleanup (#846)
1 parent 5b1ff51 commit fad1fd1

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenExpr.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "CIRGenModule.h"
1717
#include "CIRGenOpenMPRuntime.h"
1818
#include "CIRGenValue.h"
19+
#include "EHScopeStack.h"
1920
#include "TargetInfo.h"
2021

2122
#include "clang/AST/ExprCXX.h"
@@ -2210,7 +2211,9 @@ static void pushTemporaryCleanup(CIRGenFunction &CGF,
22102211
}
22112212

22122213
case SD_FullExpression:
2213-
llvm_unreachable("SD_FullExpression not implemented");
2214+
CGF.pushDestroy(NormalAndEHCleanup, ReferenceTemporary, E->getType(),
2215+
CIRGenFunction::destroyCXXObject,
2216+
CGF.getLangOpts().Exceptions);
22142217
break;
22152218

22162219
case SD_Automatic:
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
2+
// RUN: FileCheck --input-file=%t.cir %s
3+
4+
struct E {
5+
~E();
6+
E operator!();
7+
};
8+
9+
void f() {
10+
!E();
11+
}
12+
13+
// CHECK: cir.func private @_ZN1EC1Ev(!cir.ptr<!ty_E>) extra(#fn_attr)
14+
// CHECK-NEXT: cir.func private @_ZN1EntEv(!cir.ptr<!ty_E>) -> !ty_E
15+
// CHECK-NEXT: cir.func private @_ZN1ED1Ev(!cir.ptr<!ty_E>) extra(#fn_attr)
16+
// CHECK-NEXT: cir.func @_Z1fv() extra(#fn_attr1) {
17+
// CHECK-NEXT: cir.scope {
18+
// CHECK-NEXT: %[[ONE:[0-9]+]] = cir.alloca !ty_E, !cir.ptr<!ty_E>, ["agg.tmp.ensured"] {alignment = 1 : i64}
19+
// CHECK-NEXT: %[[TWO:[0-9]+]] = cir.alloca !ty_E, !cir.ptr<!ty_E>, ["ref.tmp0"] {alignment = 1 : i64}
20+
// CHECK-NEXT: cir.call @_ZN1EC1Ev(%1) : (!cir.ptr<!ty_E>) -> () extra(#fn_attr)
21+
// CHECK-NEXT: %[[THREE:[0-9]+]] = cir.call @_ZN1EntEv(%[[TWO]]) : (!cir.ptr<!ty_E>) -> !ty_E
22+
// CHECK-NEXT: cir.store %[[THREE]], %[[ONE]] : !ty_E, !cir.ptr<!ty_E>
23+
// CHECK-NEXT: cir.call @_ZN1ED1Ev(%[[ONE]]) : (!cir.ptr<!ty_E>) -> () extra(#fn_attr)
24+
// CHECK-NEXT: cir.call @_ZN1ED1Ev(%[[TWO]]) : (!cir.ptr<!ty_E>) -> () extra(#fn_attr)
25+
// CHECK-NEXT: }
26+
// CHECK-NEXT: cir.return
27+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)