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.
BaseBase17   Base(const S1&, const S2&, const char *fmt, ...) {}
18 };
19 
20 struct NonTrivialDtor {
~NonTrivialDtorNonTrivialDtor21   ~NonTrivialDtor() {}
22 };
23 struct Inheritor : public NonTrivialDtor, public Base {
24   using Base::Base;
25 };
26 
f()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* nonnull align 1 dereferenceable(1) %[[TMP1]], %struct.S2* nonnull align 1 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* nonnull align 1 dereferenceable(1) %[[TMP1]], %struct.S2* nonnull align 1 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