| 1 | // Test this without pch. |
| 2 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -include %S/cxx-templates.h -verify %s -ast-dump -o - |
| 3 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -include %S/cxx-templates.h %s -emit-llvm -o - -DNO_ERRORS | FileCheck %s |
| 4 | |
| 5 | // Test with pch. |
| 6 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h |
| 7 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -include-pch %t -verify %s -ast-dump -o - |
| 8 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -include-pch %t %s -emit-llvm -o - -error-on-deserialized-decl doNotDeserialize -DNO_ERRORS | FileCheck %s |
| 9 | |
| 10 | // Test with modules. |
| 11 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fmodules -x c++-header -emit-pch -o %t %S/cxx-templates.h |
| 12 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fmodules -include-pch %t -verify %s -ast-dump -o - |
| 13 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fmodules -include-pch %t %s -emit-llvm -o - -error-on-deserialized-decl doNotDeserialize -DNO_ERRORS -fmodules-ignore-macro=NO_ERRORS | FileCheck %s |
| 14 | |
| 15 | // Test with pch and delayed template parsing. |
| 16 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fdelayed-template-parsing -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h |
| 17 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fdelayed-template-parsing -fexceptions -include-pch %t -verify %s -ast-dump -o - |
| 18 | // RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fdelayed-template-parsing -fexceptions -include-pch %t %s -emit-llvm -o - -DNO_ERRORS | FileCheck %s |
| 19 | |
| 20 | // CHECK: define weak_odr {{.*}}void @_ZN2S4IiE1mEv |
| 21 | // CHECK: define linkonce_odr {{.*}}void @_ZN2S3IiE1mEv |
| 22 | |
| 23 | struct A { |
| 24 | typedef int type; |
| 25 | static void my_f(); |
| 26 | template <typename T> |
| 27 | static T my_templf(T x) { return x; } |
| 28 | }; |
| 29 | |
| 30 | void test(const int (&a6)[17]) { |
| 31 | int x = templ_f<int, 5>(3); |
| 32 | |
| 33 | S<char, float>::templ(); |
| 34 | S<int, char>::partial(); |
| 35 | S<int, float>::explicit_special(); |
| 36 | |
| 37 | Dep<A>::Ty ty; |
| 38 | Dep<A> a; |
| 39 | a.f(); |
| 40 | |
| 41 | S3<int> s3; |
| 42 | s3.m(); |
| 43 | |
| 44 | TS5 ts(0); |
| 45 | |
| 46 | S6<const int[17]>::t2 b6 = a6; |
| 47 | } |
| 48 | |
| 49 | template struct S4<int>; |
| 50 | |
| 51 | S7<int[5]> s7_5; |
| 52 | |
| 53 | namespace ZeroLengthExplicitTemplateArgs { |
| 54 | template void f<X>(X*); |
| 55 | } |
| 56 | |
| 57 | // This used to overwrite memory and crash. |
| 58 | namespace Test1 { |
| 59 | struct StringHasher { |
| 60 | template<typename T, char Converter(T)> static inline unsigned createHash(const T*, unsigned) { |
| 61 | return 0; |
| 62 | } |
| 63 | }; |
| 64 | |
| 65 | struct CaseFoldingHash { |
| 66 | static inline char foldCase(char) { |
| 67 | return 0; |
| 68 | } |
| 69 | |
| 70 | static unsigned hash(const char* data, unsigned length) { |
| 71 | return StringHasher::createHash<char, foldCase>(data, length); |
| 72 | } |
| 73 | }; |
| 74 | } |
| 75 | |
| 76 | template< typename D > |
| 77 | Foo< D >& Foo< D >::operator=( const Foo& other ) |
| 78 | { |
| 79 | return *this; |
| 80 | } |
| 81 | |
| 82 | namespace TestNestedExpansion { |
| 83 | struct Int { |
| 84 | Int(int); |
| 85 | friend Int operator+(Int, Int); |
| 86 | }; |
| 87 | Int &g(Int, int, double); |
| 88 | Int &test = NestedExpansion<char, char, char>().f(0, 1, 2, Int(3), 4, 5.0); |
| 89 | } |
| 90 | |
| 91 | namespace rdar13135282 { |
| 92 | void test() { |
| 93 | __mt_alloc<> mt = __mt_alloc<>(); |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | void CallDependentSpecializedFunc(DependentSpecializedFuncClass<int> &x) { |
| 98 | DependentSpecializedFunc(x); |
| 99 | } |
| 100 | |
| 101 | namespace cyclic_module_load { |
| 102 | extern std::valarray<int> x; |
| 103 | std::valarray<int> y(x); |
| 104 | } |
| 105 | |
| 106 | #ifndef NO_ERRORS |
| 107 | // expected-error@cxx-templates.h:305 {{incomplete}} |
| 108 | template int local_extern::f<int[]>(); // expected-note {{in instantiation of}} |
| 109 | #endif |
| 110 | template int local_extern::g<int[]>(); |
| 111 | |
| 112 | namespace MemberSpecializationLocation { |
| 113 | #ifndef NO_ERRORS |
| 114 | // expected-note@cxx-templates.h:* {{previous}} |
| 115 | template<> float A<int>::n; // expected-error {{redeclaration of 'n' with a different type}} |
| 116 | #endif |
| 117 | int k = A<int>::n; |
| 118 | } |
| 119 | |
| 120 | // https://bugs.llvm.org/show_bug.cgi?id=34728 |
| 121 | namespace PR34728 { |
| 122 | int test() { |
| 123 | // Verify with several TemplateParmDecl kinds, using PCH (incl. modules). |
| 124 | int z1 = func1(/*ignored*/2.718); |
| 125 | int z2 = func2(/*ignored*/3.142); |
| 126 | int tmp3 = 30; |
| 127 | Container<int> c = func3(tmp3); |
| 128 | int z3 = c.item; |
| 129 | |
| 130 | // Return value is meaningless. Just "use" all these values to avoid |
| 131 | // warning about unused vars / values. |
| 132 | return z1 + z2 + z3; |
| 133 | } |
| 134 | } // end namespace PR34728 |
| 135 | |