15bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O3 | FileCheck %s
2a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson
35bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlssonnamespace {
45bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson
54e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlssonstatic int ctorcalls;
64e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlssonstatic int dtorcalls;
75bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson
85bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlssonstruct A {
94e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson  A() : i(0) { ctorcalls++; }
104e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson  ~A() { dtorcalls++; }
11a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson  int i;
12c1b32f69687ed289fb1150df34965ada250caf70Anders Carlsson
13c1b32f69687ed289fb1150df34965ada250caf70Anders Carlsson  friend const A& operator<<(const A& a, int n) {
14c1b32f69687ed289fb1150df34965ada250caf70Anders Carlsson    return a;
15c1b32f69687ed289fb1150df34965ada250caf70Anders Carlsson  }
16a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson};
17a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson
185bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlssonvoid g(int) { }
19c1b32f69687ed289fb1150df34965ada250caf70Anders Carlssonvoid g(const A&) { }
20a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson
215bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlssonvoid f1(bool b) {
225bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson  g(b ? A().i : 0);
235bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson  g(b || A().i);
245bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson  g(b && A().i);
25c1b32f69687ed289fb1150df34965ada250caf70Anders Carlsson  g(b ? A() << 1 : A() << 2);
265bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson}
27a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson
285bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlssonstruct Checker {
295bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson  Checker() {
305bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson    f1(true);
315bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson    f1(false);
325bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson  }
335bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson};
34a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson
355bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders CarlssonChecker c;
365bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson
375bb0ddd10b07ecc0df43f0d5f50f0b9f10046426Anders Carlsson}
38a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson
3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z12getCtorCallsv()
404e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlssonint getCtorCalls() {
418ffc80fe5413bcb9f350ae4d1c2d7617af970c8eAnders Carlsson  // CHECK: ret i32 5
424e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson  return ctorcalls;
434e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson}
444e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson
4593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_Z12getDtorCallsv()
464e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlssonint getDtorCalls() {
478ffc80fe5413bcb9f350ae4d1c2d7617af970c8eAnders Carlsson  // CHECK: ret i32 5
484e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson  return dtorcalls;
494e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson}
504e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson
5193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define zeroext i1 @_Z7successv()
524e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlssonbool success() {
534e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson  // CHECK: ret i1 true
544e3014be0606d6be5554d76f317d5908be3bccfcAnders Carlsson  return ctorcalls == dtorcalls;
55a36bf8f74180e834c6bf2db867796fd5338495abAnders Carlsson}
56