| 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 | |||||
| Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame^] | 39 | // CHECK-LABEL: define i32 @_Z12getCtorCallsv() |
| Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 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 | |||||
| Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame^] | 45 | // CHECK-LABEL: define i32 @_Z12getDtorCallsv() |
| Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 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 | |||||
| Stephen Lin | 93ab6bf | 2013-08-15 06:47:53 +0000 | [diff] [blame^] | 51 | // CHECK-LABEL: define zeroext i1 @_Z7successv() |
| Anders Carlsson | 4e3014b | 2010-02-04 17:23:15 +0000 | [diff] [blame] | 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 | } |