// Test this without pch. // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -include %S/cxx-templates.h -verify %s -ast-dump -o - // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -include %S/cxx-templates.h %s -emit-llvm -o - | FileCheck %s // Test with pch. // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -include-pch %t -verify %s -ast-dump -o - // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -include-pch %t %s -emit-llvm -o - | FileCheck %s // CHECK: define weak_odr void @_ZN2S4IiE1mEv // CHECK: define linkonce_odr void @_ZN2S3IiE1mEv struct A { typedef int type; static void my_f(); template static T my_templf(T x) { return x; } }; void test(const int (&a6)[17]) { int x = templ_f(3); S::templ(); S::partial(); S::explicit_special(); Dep::Ty ty; Dep a; a.f(); S3 s3; s3.m(); TS5 ts(0); S6::t2 b6 = a6; } template struct S4; S7 s7_5; namespace ZeroLengthExplicitTemplateArgs { template void f(X*); } // This used to overwrite memory and crash. namespace Test1 { struct StringHasher { template static inline unsigned createHash(const T*, unsigned) { return 0; } }; struct CaseFoldingHash { static inline char foldCase(char) { return 0; } static unsigned hash(const char* data, unsigned length) { return StringHasher::createHash(data, length); } }; } template< typename D > Foo< D >& Foo< D >::operator=( const Foo& other ) { return *this; }