Home | History | Annotate | Download | only in PCH
      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 (at) 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