1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O3 | FileCheck %s 2*f4a2713aSLionel Sambuc 3*f4a2713aSLionel Sambuc namespace { 4*f4a2713aSLionel Sambuc 5*f4a2713aSLionel Sambuc static int ctorcalls; 6*f4a2713aSLionel Sambuc static int dtorcalls; 7*f4a2713aSLionel Sambuc 8*f4a2713aSLionel Sambuc struct A { A__anonce78f5d90111::A9*f4a2713aSLionel Sambuc A() : i(0) { ctorcalls++; } ~A__anonce78f5d90111::A10*f4a2713aSLionel Sambuc ~A() { dtorcalls++; } 11*f4a2713aSLionel Sambuc int i; 12*f4a2713aSLionel Sambuc operator <<(const A & a,int n)13*f4a2713aSLionel Sambuc friend const A& operator<<(const A& a, int n) { 14*f4a2713aSLionel Sambuc return a; 15*f4a2713aSLionel Sambuc } 16*f4a2713aSLionel Sambuc }; 17*f4a2713aSLionel Sambuc g(int)18*f4a2713aSLionel Sambucvoid g(int) { } g(const A &)19*f4a2713aSLionel Sambucvoid g(const A&) { } 20*f4a2713aSLionel Sambuc f1(bool b)21*f4a2713aSLionel Sambucvoid f1(bool b) { 22*f4a2713aSLionel Sambuc g(b ? A().i : 0); 23*f4a2713aSLionel Sambuc g(b || A().i); 24*f4a2713aSLionel Sambuc g(b && A().i); 25*f4a2713aSLionel Sambuc g(b ? A() << 1 : A() << 2); 26*f4a2713aSLionel Sambuc } 27*f4a2713aSLionel Sambuc 28*f4a2713aSLionel Sambuc struct Checker { Checker__anonce78f5d90111::Checker29*f4a2713aSLionel Sambuc Checker() { 30*f4a2713aSLionel Sambuc f1(true); 31*f4a2713aSLionel Sambuc f1(false); 32*f4a2713aSLionel Sambuc } 33*f4a2713aSLionel Sambuc }; 34*f4a2713aSLionel Sambuc 35*f4a2713aSLionel Sambuc Checker c; 36*f4a2713aSLionel Sambuc 37*f4a2713aSLionel Sambuc } 38*f4a2713aSLionel Sambuc 39*f4a2713aSLionel Sambuc // CHECK-LABEL: define i32 @_Z12getCtorCallsv() getCtorCalls()40*f4a2713aSLionel Sambucint getCtorCalls() { 41*f4a2713aSLionel Sambuc // CHECK: ret i32 5 42*f4a2713aSLionel Sambuc return ctorcalls; 43*f4a2713aSLionel Sambuc } 44*f4a2713aSLionel Sambuc 45*f4a2713aSLionel Sambuc // CHECK-LABEL: define i32 @_Z12getDtorCallsv() getDtorCalls()46*f4a2713aSLionel Sambucint getDtorCalls() { 47*f4a2713aSLionel Sambuc // CHECK: ret i32 5 48*f4a2713aSLionel Sambuc return dtorcalls; 49*f4a2713aSLionel Sambuc } 50*f4a2713aSLionel Sambuc 51*f4a2713aSLionel Sambuc // CHECK-LABEL: define zeroext i1 @_Z7successv() success()52*f4a2713aSLionel Sambucbool success() { 53*f4a2713aSLionel Sambuc // CHECK: ret i1 true 54*f4a2713aSLionel Sambuc return ctorcalls == dtorcalls; 55*f4a2713aSLionel Sambuc } 56