|  | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O3 | FileCheck %s | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | static int ctorcalls; | 
|  | static int dtorcalls; | 
|  |  | 
|  | struct A { | 
|  | A() : i(0) { ctorcalls++; } | 
|  | ~A() { dtorcalls++; } | 
|  | int i; | 
|  |  | 
|  | friend const A& operator<<(const A& a, int n) { | 
|  | return a; | 
|  | } | 
|  | }; | 
|  |  | 
|  | void g(int) { } | 
|  | void g(const A&) { } | 
|  |  | 
|  | void f1(bool b) { | 
|  | g(b ? A().i : 0); | 
|  | g(b || A().i); | 
|  | g(b && A().i); | 
|  | g(b ? A() << 1 : A() << 2); | 
|  | } | 
|  |  | 
|  | struct Checker { | 
|  | Checker() { | 
|  | f1(true); | 
|  | f1(false); | 
|  | } | 
|  | }; | 
|  |  | 
|  | Checker c; | 
|  |  | 
|  | } | 
|  |  | 
|  | // CHECK: define i32 @_Z12getCtorCallsv() | 
|  | int getCtorCalls() { | 
|  | // CHECK: ret i32 5 | 
|  | return ctorcalls; | 
|  | } | 
|  |  | 
|  | // CHECK: define i32 @_Z12getDtorCallsv() | 
|  | int getDtorCalls() { | 
|  | // CHECK: ret i32 5 | 
|  | return dtorcalls; | 
|  | } | 
|  |  | 
|  | // CHECK: define zeroext i1 @_Z7successv() | 
|  | bool success() { | 
|  | // CHECK: ret i1 true | 
|  | return ctorcalls == dtorcalls; | 
|  | } |