blob: d5382872f9d93d650fe6085fc0671d95fdb872f7 [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
Anders Carlsson4e3014b2010-02-04 17:23:15 +000039// CHECK: define i32 @_Z12getCtorCallsv()
40int 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
45// CHECK: define i32 @_Z12getDtorCallsv()
46int 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
51// CHECK: define zeroext i1 @_Z7successv()
52bool success() {
53 // CHECK: ret i1 true
54 return ctorcalls == dtorcalls;
Anders Carlssona36bf8f2009-11-20 17:27:56 +000055}