Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -O3 | FileCheck %s |
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 2 | |
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 3 | namespace { |
4 | |||||
Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 5 | static int ctorcalls; |
6 | static int dtorcalls; | ||||
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 7 | |
8 | struct A { | ||||
Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 9 | A() : i(0) { ctorcalls++; } |
10 | ~A() { dtorcalls++; } | ||||
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 11 | int i; |
Anders Carlsson | c1b32f6 | 2010-02-04 17:26:01 +0000 | [diff] [blame] | 12 | |
13 | friend const A& operator<<(const A& a, int n) { | ||||
14 | return a; | ||||
15 | } | ||||
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 16 | }; |
17 | |||||
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 18 | void g(int) { } |
Anders Carlsson | c1b32f6 | 2010-02-04 17:26:01 +0000 | [diff] [blame] | 19 | void g(const A&) { } |
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 20 | |
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 21 | void f1(bool b) { |
22 | g(b ? A().i : 0); | ||||
23 | g(b || A().i); | ||||
24 | g(b && A().i); | ||||
Anders Carlsson | c1b32f6 | 2010-02-04 17:26:01 +0000 | [diff] [blame] | 25 | g(b ? A() << 1 : A() << 2); |
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 26 | } |
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 27 | |
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 28 | struct Checker { |
29 | Checker() { | ||||
30 | f1(true); | ||||
31 | f1(false); | ||||
32 | } | ||||
33 | }; | ||||
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 34 | |
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 35 | Checker c; |
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 36 | |
Anders Carlsson | 5bb0ddd | 2010-02-04 17:06:52 +0000 | [diff] [blame] | 37 | } |
38 | |||||
Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 39 | // CHECK: define i32 @_Z12getCtorCallsv() |
40 | int getCtorCalls() { | ||||
Anders Carlsson | 8ffc80f | 2010-02-04 17:29:32 +0000 | [diff] [blame] | 41 | // CHECK: ret i32 5 |
Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 42 | return ctorcalls; |
43 | } | ||||
44 | |||||
45 | // CHECK: define i32 @_Z12getDtorCallsv() | ||||
46 | int getDtorCalls() { | ||||
Anders Carlsson | 8ffc80f | 2010-02-04 17:29:32 +0000 | [diff] [blame] | 47 | // CHECK: ret i32 5 |
Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 48 | return dtorcalls; |
49 | } | ||||
50 | |||||
51 | // CHECK: define zeroext i1 @_Z7successv() | ||||
52 | bool success() { | ||||
53 | // CHECK: ret i1 true | ||||
54 | return ctorcalls == dtorcalls; | ||||
Anders Carlsson | a36bf8f | 2009-11-20 17:27:56 +0000 | [diff] [blame] | 55 | } |