blob: a3cc2fef1e8fda42ab7694d252f50521cfa80f75 [file] [log] [blame]
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +00001// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O3 | FileCheck %s
Anders Carlssona36bf8f2009-11-20 17:27:56 +00002
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +00003namespace {
4
Anders Carlsson4e3014b2010-02-04 17:23:15 +00005static int ctorcalls;
6static int dtorcalls;
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +00007
8struct A {
Anders Carlsson4e3014b2010-02-04 17:23:15 +00009 A() : i(0) { ctorcalls++; }
10 ~A() { dtorcalls++; }
Anders Carlssona36bf8f2009-11-20 17:27:56 +000011 int i;
Anders Carlssonc1b32f62010-02-04 17:26:01 +000012
13 friend const A& operator<<(const A& a, int n) {
14 return a;
15 }
Anders Carlssona36bf8f2009-11-20 17:27:56 +000016};
17
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +000018void g(int) { }
Anders Carlssonc1b32f62010-02-04 17:26:01 +000019void g(const A&) { }
Anders Carlssona36bf8f2009-11-20 17:27:56 +000020
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +000021void f1(bool b) {
22 g(b ? A().i : 0);
23 g(b || A().i);
24 g(b && A().i);
Anders Carlssonc1b32f62010-02-04 17:26:01 +000025 g(b ? A() << 1 : A() << 2);
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +000026}
Anders Carlssona36bf8f2009-11-20 17:27:56 +000027
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +000028struct Checker {
29 Checker() {
30 f1(true);
31 f1(false);
32 }
33};
Anders Carlssona36bf8f2009-11-20 17:27:56 +000034
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +000035Checker c;
Anders Carlssona36bf8f2009-11-20 17:27:56 +000036
Anders Carlsson5bb0ddd2010-02-04 17:06:52 +000037}
38
Stephen Lin93ab6bf2013-08-15 06:47:53 +000039// CHECK-LABEL: define i32 @_Z12getCtorCallsv()
Anders Carlsson4e3014b2010-02-04 17:23:15 +000040int getCtorCalls() {
Anders Carlsson8ffc80f2010-02-04 17:29:32 +000041 // CHECK: ret i32 5
Anders Carlsson4e3014b2010-02-04 17:23:15 +000042 return ctorcalls;
43}
44
Stephen Lin93ab6bf2013-08-15 06:47:53 +000045// CHECK-LABEL: define i32 @_Z12getDtorCallsv()
Anders Carlsson4e3014b2010-02-04 17:23:15 +000046int getDtorCalls() {
Anders Carlsson8ffc80f2010-02-04 17:29:32 +000047 // CHECK: ret i32 5
Anders Carlsson4e3014b2010-02-04 17:23:15 +000048 return dtorcalls;
49}
50
Stephen Lin93ab6bf2013-08-15 06:47:53 +000051// CHECK-LABEL: define zeroext i1 @_Z7successv()
Anders Carlsson4e3014b2010-02-04 17:23:15 +000052bool success() {
53 // CHECK: ret i1 true
54 return ctorcalls == dtorcalls;
Anders Carlssona36bf8f2009-11-20 17:27:56 +000055}