cxx-templates.cpp revision 8e8fb3be5bd78f0564444eca02b404566a5f3b5d
1dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis// Test this without pch. 29a4db032ecd991626d236a502e770126db32bd31Richard Smith// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include %S/cxx-templates.h -verify %s -ast-dump -o - 39a4db032ecd991626d236a502e770126db32bd31Richard Smith// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include %S/cxx-templates.h %s -emit-llvm -o - | FileCheck %s 490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 5dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis// Test with pch. 69a4db032ecd991626d236a502e770126db32bd31Richard Smith// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -x c++-header -emit-pch -o %t %S/cxx-templates.h 79a4db032ecd991626d236a502e770126db32bd31Richard Smith// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include-pch %t -verify %s -ast-dump -o - 89a4db032ecd991626d236a502e770126db32bd31Richard Smith// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -fexceptions -include-pch %t %s -emit-llvm -o - | FileCheck %s 9a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 108e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics 118e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs 120e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis// CHECK: define weak_odr void @_ZN2S4IiE1mEv 13a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis// CHECK: define linkonce_odr void @_ZN2S3IiE1mEv 148dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 158dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstruct A { 168dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis typedef int type; 178dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis static void my_f(); 188dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis template <typename T> 198dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis static T my_templf(T x) { return x; } 208dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}; 21f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis 2232adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorvoid test(const int (&a6)[17]) { 23b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis int x = templ_f<int, 5>(3); 24dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis 25dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis S<char, float>::templ(); 26dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis S<int, char>::partial(); 27dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis S<int, float>::explicit_special(); 288dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 298dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis Dep<A>::Ty ty; 308dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis Dep<A> a; 318dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis a.f(); 32a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis 33a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis S3<int> s3; 34a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis s3.m(); 35f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis 36f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis TS5 ts(0); 3732adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor 3832adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor S6<const int[17]>::t2 b6 = a6; 39f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis} 400e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis 410e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidistemplate struct S4<int>; 427c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor 437c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas GregorS7<int[5]> s7_5; 44def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor 45def0354384d9c4431f7b58b664b59896d4623028Douglas Gregornamespace ZeroLengthExplicitTemplateArgs { 46def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor template void f<X>(X*); 47def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor} 48b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson 49b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson// This used to overwrite memory and crash. 50b0ca137bf399d956a3424816c238bc2532250d17Anders Carlssonnamespace Test1 { 51b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson struct StringHasher { 52b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson template<typename T, char Converter(T)> static inline unsigned createHash(const T*, unsigned) { 53b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson return 0; 54b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson } 55b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson }; 56b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson 57b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson struct CaseFoldingHash { 58b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson static inline char foldCase(char) { 59b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson return 0; 60b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson } 61b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson 62b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson static unsigned hash(const char* data, unsigned length) { 63b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson return StringHasher::createHash<char, foldCase>(data, length); 64b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson } 65b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson }; 66b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson} 67a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor 68a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregortemplate< typename D > 69a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas GregorFoo< D >& Foo< D >::operator=( const Foo& other ) 70a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor{ 71a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor return *this; 72a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor} 739a4db032ecd991626d236a502e770126db32bd31Richard Smith 749a4db032ecd991626d236a502e770126db32bd31Richard Smithnamespace TestNestedExpansion { 759a4db032ecd991626d236a502e770126db32bd31Richard Smith struct Int { 769a4db032ecd991626d236a502e770126db32bd31Richard Smith Int(int); 779a4db032ecd991626d236a502e770126db32bd31Richard Smith friend Int operator+(Int, Int); 789a4db032ecd991626d236a502e770126db32bd31Richard Smith }; 799a4db032ecd991626d236a502e770126db32bd31Richard Smith Int &g(Int, int, double); 809a4db032ecd991626d236a502e770126db32bd31Richard Smith Int &test = NestedExpansion<char, char, char>().f(0, 1, 2, Int(3), 4, 5.0); 819a4db032ecd991626d236a502e770126db32bd31Richard Smith} 82