1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 3374cbbcce032a22039f208baab7778e2f1f4a0a3Douglas Gregor// This test concerns the identity of dependent types within the 4374cbbcce032a22039f208baab7778e2f1f4a0a3Douglas Gregor// canonical type system. This corresponds to C++ [temp.type], which 5374cbbcce032a22039f208baab7778e2f1f4a0a3Douglas Gregor// specifies type equivalence within a template. 6374cbbcce032a22039f208baab7778e2f1f4a0a3Douglas Gregor// 7374cbbcce032a22039f208baab7778e2f1f4a0a3Douglas Gregor// FIXME: template template parameters 8374cbbcce032a22039f208baab7778e2f1f4a0a3Douglas Gregor 9c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregornamespace N { 10c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor template<typename T> 11c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor struct X2 { 12c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor template<typename U> 13c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor struct apply { 14c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor typedef U* type; 15c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor }; 16c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor }; 17c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor} 18c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor 19c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregornamespace Nalias = N; 20c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor 21b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregortemplate<typename T> 22b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregorstruct X0 { }; 23b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 24c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregorusing namespace N; 25c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor 26b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregortemplate<typename T, typename U> 27b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregorstruct X1 { 28b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor typedef T type; 29905406bd99b8498873a045f93ef196df6fe6cc69Douglas Gregor typedef U U_type; 30b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 31b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f0(T); // expected-note{{previous}} 32b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f0(U); 33b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f0(type); // expected-error{{redeclar}} 34b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 35b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f1(T*); // expected-note{{previous}} 36b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f1(U*); 37b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f1(type*); // expected-error{{redeclar}} 38b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 39b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f2(X0<T>*); // expected-note{{previous}} 40b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f2(X0<U>*); 41b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f2(X0<type>*); // expected-error{{redeclar}} 42b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 43b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f3(X0<T>*); // expected-note{{previous}} 44b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f3(X0<U>*); 45b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f3(::X0<type>*); // expected-error{{redeclar}} 46b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 47905406bd99b8498873a045f93ef196df6fe6cc69Douglas Gregor void f4(typename T::template apply<U>*); // expected-note{{previous}} 48b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f4(typename U::template apply<U>*); 49b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f4(typename type::template apply<T>*); 50905406bd99b8498873a045f93ef196df6fe6cc69Douglas Gregor void f4(typename type::template apply<U_type>*); // expected-error{{redeclar}} 51b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor 52905406bd99b8498873a045f93ef196df6fe6cc69Douglas Gregor void f5(typename T::template apply<U>::type*); // expected-note{{previous}} 53b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f5(typename U::template apply<U>::type*); 54b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f5(typename U::template apply<T>::type*); 55b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor void f5(typename type::template apply<T>::type*); 56905406bd99b8498873a045f93ef196df6fe6cc69Douglas Gregor void f5(typename type::template apply<U_type>::type*); // expected-error{{redeclar}} 57c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor 58c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f6(typename N::X2<T>::template apply<U> *); // expected-note{{previous}} 59c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f6(typename N::X2<U>::template apply<U> *); 60c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f6(typename N::X2<U>::template apply<T> *); 61c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f6(typename ::N::X2<type>::template apply<U_type> *); // expected-error{{redeclar}} 62c03d3303fb298ae86bf5d5d6c98755928fdbde00Douglas Gregor 63c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f7(typename N::X2<T>::template apply<U> *); // expected-note{{previous}} 64c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f7(typename N::X2<U>::template apply<U> *); 65c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f7(typename N::X2<U>::template apply<T> *); 66c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f7(typename X2<type>::template apply<U_type> *); // expected-error{{redeclar}} 67c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor 68c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f8(typename N::X2<T>::template apply<U> *); // expected-note{{previous}} 69c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f8(typename N::X2<U>::template apply<U> *); 70c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f8(typename N::X2<U>::template apply<T> *); 71c964fb2a3b6dcb3a01f974a33b7be543d31fa285Douglas Gregor void f8(typename ::Nalias::X2<type>::template apply<U_type> *); // expected-error{{redeclar}} 72b88ba4173268f00ef39cfa6c6804d43ef510646dDouglas Gregor}; 73d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor 74d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregornamespace PR6851 { 75d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor template <bool v> 76d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor struct S; 77d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor 78d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor struct N { 79d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor template <bool w> 80d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor S< S<w>::cond && 1 > foo(); 81d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor }; 82d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor 83d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor struct Alien; 84d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor bool operator&&(const Alien&, const Alien&); 85d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor 86d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor template <bool w> 87d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor S< S<w>::cond && 1 > N::foo() { } 88d83686bcce42cab1184da1f9c6980c238510edd6Douglas Gregor} 896ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor 906ff237965f97c96152e52fee566f03af687d86aaDouglas Gregornamespace PR7460 { 916ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor template <typename T> 926ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor struct TemplateClass2 936ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor { 946ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor enum { SIZE = 100 }; 956ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor static T member[SIZE]; 966ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor }; 976ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor 986ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor template <typename T> 996ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor T TemplateClass2<T>::member[TemplateClass2<T>::SIZE]; 1006ff237965f97c96152e52fee566f03af687d86aaDouglas Gregor} 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18275 { 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> struct A { 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f(const int); 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g(int); 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h(const T); 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void i(T); 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void A<T>::f(int x) { x = 0; } 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> 11458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar void A<T>::g(const int x) { // expected-note {{declared const here}} 11558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar x = 0; // expected-error {{cannot assign to variable 'x'}} 11658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar } 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void A<T>::h(T) {} // FIXME: Should reject this. Type is different from prior decl if T is an array type. 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void A<T>::i(const T) {} // FIXME: Should reject this. Type is different from prior decl if T is an array type. 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template struct A<int>; 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template struct A<int[1]>; 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR21289 { 129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename T> using X = int; 130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename T, decltype(sizeof(0))> using Y = int; 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename ...Ts> struct S {}; 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename ...Ts> void f() { 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // This is a dependent type. It is *not* S<int>, even though it canonically 134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // contains no template parameters. 135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines using Type = S<X<Ts>...>; 136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Type s; 137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines using Type = S<int, int, int>; 138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void g() { f<void, void, void>(); } 140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename ...Ts> void h(S<int>) {} 142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Pending a core issue, it's not clear if these are redeclarations, but they 143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // are probably intended to be... even though substitution can succeed for one 144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // of them but fail for the other! 145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename ...Ts> void h(S<X<Ts>...>) {} // expected-note {{previous}} 146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename ...Ts> void h(S<Y<Ts, sizeof(Ts)>...>) {} // expected-error {{redefinition}} 147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 148