xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/conditional-temporaries.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
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 Sambuc void g(int) { }
g(const A &)19*f4a2713aSLionel Sambuc void g(const A&) { }
20*f4a2713aSLionel Sambuc 
f1(bool b)21*f4a2713aSLionel Sambuc void 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 Sambuc int 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 Sambuc int 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 Sambuc bool success() {
53*f4a2713aSLionel Sambuc   // CHECK: ret i1 true
54*f4a2713aSLionel Sambuc   return ctorcalls == dtorcalls;
55*f4a2713aSLionel Sambuc }
56