1 | // RUN: %clang_cc1 -triple x86_64-darwin -std=c++11 -emit-llvm -o - %s | FileCheck %s |
2 | // RUN: %clang_cc1 -triple x86_64-darwin -std=c++11 -fcxx-exceptions -fexceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=EXCEPTIONS |
3 | |
4 | // PR36748 |
5 | // rdar://problem/45805151 |
6 | |
7 | // Classes to verify order of destroying function parameters. |
8 | struct S1 { |
9 | ~S1(); |
10 | }; |
11 | struct S2 { |
12 | ~S2(); |
13 | }; |
14 | |
15 | struct Base { |
16 | // Use variadic args to cause inlining the inherited constructor. |
17 | Base(const S1&, const S2&, const char *fmt, ...) {} |
18 | }; |
19 | |
20 | struct NonTrivialDtor { |
21 | ~NonTrivialDtor() {} |
22 | }; |
23 | struct Inheritor : public NonTrivialDtor, public Base { |
24 | using Base::Base; |
25 | }; |
26 | |
27 | void f() { |
28 | Inheritor(S1(), S2(), "foo"); |
29 | // CHECK-LABEL: define void @_Z1fv |
30 | // CHECK: %[[TMP1:.*]] = alloca %struct.S1 |
31 | // CHECK: %[[TMP2:.*]] = alloca %struct.S2 |
32 | // CHECK: call void (%struct.Base*, %struct.S1*, %struct.S2*, i8*, ...) @_ZN4BaseC2ERK2S1RK2S2PKcz(%struct.Base* {{.*}}, %struct.S1* dereferenceable(1) %[[TMP1]], %struct.S2* dereferenceable(1) %[[TMP2]], i8* {{.*}}) |
33 | // CHECK-NEXT: call void @_ZN9InheritorD1Ev(%struct.Inheritor* {{.*}}) |
34 | // CHECK-NEXT: call void @_ZN2S2D1Ev(%struct.S2* %[[TMP2]]) |
35 | // CHECK-NEXT: call void @_ZN2S1D1Ev(%struct.S1* %[[TMP1]]) |
36 | |
37 | // EXCEPTIONS-LABEL: define void @_Z1fv |
38 | // EXCEPTIONS: %[[TMP1:.*]] = alloca %struct.S1 |
39 | // EXCEPTIONS: %[[TMP2:.*]] = alloca %struct.S2 |
40 | // EXCEPTIONS: invoke void (%struct.Base*, %struct.S1*, %struct.S2*, i8*, ...) @_ZN4BaseC2ERK2S1RK2S2PKcz(%struct.Base* {{.*}}, %struct.S1* dereferenceable(1) %[[TMP1]], %struct.S2* dereferenceable(1) %[[TMP2]], i8* {{.*}}) |
41 | // EXCEPTIONS-NEXT: to label %[[CONT:.*]] unwind label %[[LPAD:.*]] |
42 | |
43 | // EXCEPTIONS: [[CONT]]: |
44 | // EXCEPTIONS-NEXT: call void @_ZN9InheritorD1Ev(%struct.Inheritor* {{.*}}) |
45 | // EXCEPTIONS-NEXT: call void @_ZN2S2D1Ev(%struct.S2* %[[TMP2]]) |
46 | // EXCEPTIONS-NEXT: call void @_ZN2S1D1Ev(%struct.S1* %[[TMP1]]) |
47 | |
48 | // EXCEPTIONS: [[LPAD]]: |
49 | // EXCEPTIONS: call void @_ZN14NonTrivialDtorD2Ev(%struct.NonTrivialDtor* {{.*}}) |
50 | // EXCEPTIONS-NEXT: call void @_ZN2S2D1Ev(%struct.S2* %[[TMP2]]) |
51 | // EXCEPTIONS-NEXT: call void @_ZN2S1D1Ev(%struct.S1* %[[TMP1]]) |
52 | } |
53 | |