Daniel Dunbar | 8fbe78f | 2009-12-15 20:14:24 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s |
Anders Carlsson | feb6050 | 2009-09-17 00:43:46 +0000 | [diff] [blame] | 2 | |
| 3 | struct X {}; |
| 4 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 5 | // CHECK-LABEL: define void @_Z1f1XS_( |
Anders Carlsson | feb6050 | 2009-09-17 00:43:46 +0000 | [diff] [blame] | 6 | void f(X, X) { } |
| 7 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 8 | // CHECK-LABEL: define void @_Z1fR1XS0_( |
Anders Carlsson | feb6050 | 2009-09-17 00:43:46 +0000 | [diff] [blame] | 9 | void f(X&, X&) { } |
| 10 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 11 | // CHECK-LABEL: define void @_Z1fRK1XS1_( |
Anders Carlsson | feb6050 | 2009-09-17 00:43:46 +0000 | [diff] [blame] | 12 | void f(const X&, const X&) { } |
| 13 | |
| 14 | typedef void T(); |
| 15 | struct S {}; |
| 16 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 17 | // CHECK-LABEL: define void @_Z1fPFvvEM1SFvvE( |
Anders Carlsson | feb6050 | 2009-09-17 00:43:46 +0000 | [diff] [blame] | 18 | void f(T*, T (S::*)) {} |
| 19 | |
Anders Carlsson | 4245bf9 | 2009-09-17 04:16:28 +0000 | [diff] [blame] | 20 | namespace A { |
| 21 | struct A { }; |
| 22 | struct B { }; |
| 23 | }; |
| 24 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 25 | // CHECK-LABEL: define void @_Z1fN1A1AENS_1BE( |
Anders Carlsson | 4245bf9 | 2009-09-17 04:16:28 +0000 | [diff] [blame] | 26 | void f(A::A a, A::B b) { } |
Anders Carlsson | 296f8dc | 2009-09-26 03:55:37 +0000 | [diff] [blame] | 27 | |
| 28 | struct C { |
| 29 | struct D { }; |
| 30 | }; |
| 31 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 32 | // CHECK-LABEL: define void @_Z1fN1C1DERS_PS_S1_( |
Anders Carlsson | 296f8dc | 2009-09-26 03:55:37 +0000 | [diff] [blame] | 33 | void f(C::D, C&, C*, C&) { } |
Anders Carlsson | 9bf787a | 2009-09-27 01:06:07 +0000 | [diff] [blame] | 34 | |
| 35 | template<typename T> |
| 36 | struct V { |
| 37 | typedef int U; |
| 38 | }; |
| 39 | |
| 40 | template <typename T> void f1(typename V<T>::U, V<T>) { } |
| 41 | |
| 42 | // CHECK: @_Z2f1IiEvN1VIT_E1UES2_ |
| 43 | template void f1<int>(int, V<int>); |
| 44 | |
| 45 | template <typename T> void f2(V<T>, typename V<T>::U) { } |
| 46 | |
| 47 | // CHECK: @_Z2f2IiEv1VIT_ENS2_1UE |
| 48 | template void f2<int>(V<int>, int); |
Anders Carlsson | d122de5 | 2009-09-27 19:53:49 +0000 | [diff] [blame] | 49 | |
| 50 | namespace NS { |
| 51 | template <typename T> struct S1 {}; |
| 52 | template<typename T> void ft3(S1<T>, S1<char>) { } |
| 53 | |
| 54 | // CHECK: @_ZN2NS3ft3IiEEvNS_2S1IT_EENS1_IcEE |
| 55 | template void ft3<int>(S1<int>, S1<char>); |
| 56 | } |
Anders Carlsson | f847117 | 2009-10-16 02:06:06 +0000 | [diff] [blame] | 57 | |
| 58 | // PR5196 |
| 59 | // CHECK: @_Z1fPKcS0_ |
| 60 | void f(const char*, const char*) {} |
| 61 | |
Anders Carlsson | ce21431 | 2009-11-07 04:26:04 +0000 | [diff] [blame] | 62 | namespace NS { |
| 63 | class C; |
| 64 | } |
| 65 | |
| 66 | namespace NS { |
| 67 | // CHECK: @_ZN2NS1fERNS_1CE |
| 68 | void f(C&) { } |
| 69 | } |
Anders Carlsson | d563923 | 2010-06-02 04:29:50 +0000 | [diff] [blame] | 70 | |
| 71 | namespace Test1 { |
| 72 | |
| 73 | struct A { }; |
| 74 | struct B { }; |
| 75 | |
| 76 | // CHECK: @_ZN5Test11fEMNS_1BEFvvENS_1AES3_ |
| 77 | void f(void (B::*)(), A, A) { } |
| 78 | |
| 79 | // CHECK: @_ZN5Test11fEMNS_1BEFvvENS_1AES3_MS0_FvS3_EMS3_FvvE |
| 80 | void f(void (B::*)(), A, A, void (B::*)(A), void (A::*)()) { } |
| 81 | |
| 82 | } |
David Majnemer | a88b359 | 2015-02-18 02:28:01 +0000 | [diff] [blame^] | 83 | |
| 84 | namespace ManglePrefix { |
| 85 | template <typename> |
| 86 | struct X { |
| 87 | template <typename> |
| 88 | struct Y { |
| 89 | typedef int type; |
| 90 | typedef int type2; |
| 91 | }; |
| 92 | }; |
| 93 | template <typename T> |
| 94 | typename X<T>::template Y<T>::type f(typename X<T>::template Y<T>::type2) { return 0; } |
| 95 | |
| 96 | // CHECK: @_ZN12ManglePrefix1fIiEENS_1XIT_E1YIS2_E4typeENS5_5type2E |
| 97 | template int f<int>(int); |
| 98 | } |