191305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s 291305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregortemplate<class T> struct A { 391305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor static T t; // expected-error{{static data member instantiated with function type 'int ()'}} 491305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor}; 591305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregortypedef int function(); 691305bf1b2e75937fb60db03cca766ad983fffdbDouglas GregorA<function> a; // expected-note{{instantiation of}} 791305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor 891305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregortemplate<typename T> struct B { 991305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor B() { T t; } // expected-error{{variable instantiated with function type 'int ()'}} 1091305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor}; 1191305bf1b2e75937fb60db03cca766ad983fffdbDouglas GregorB<function> b; // expected-note{{instantiation of}} 1291305bf1b2e75937fb60db03cca766ad983fffdbDouglas Gregor 13d7092324128ecd14933040b3854037090a7672daDouglas Gregortemplate <typename T> int f0(void *, const T&); // expected-note{{candidate template ignored: substitution failure}} 145e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregorenum {e}; // expected-note{{unnamed type used in template argument was declared here}} 15d7092324128ecd14933040b3854037090a7672daDouglas Gregor 16d7092324128ecd14933040b3854037090a7672daDouglas Gregorvoid test_f0(int n) { 175e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor int i = f0(0, e); // expected-warning{{template argument uses unnamed type}} 18d7092324128ecd14933040b3854037090a7672daDouglas Gregor int vla[n]; 19d7092324128ecd14933040b3854037090a7672daDouglas Gregor f0(0, vla); // expected-error{{no matching function for call to 'f0'}} 20d7092324128ecd14933040b3854037090a7672daDouglas Gregor} 21d7092324128ecd14933040b3854037090a7672daDouglas Gregor 225e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregornamespace N0 { 235e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor template <typename R, typename A1> void f0(R (*)(A1)); 245e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor template <typename T> int f1(T); 255e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor template <typename T, typename U> int f1(T, U); 265e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor enum {e1}; // expected-note 2{{unnamed type used in template argument was declared here}} 275e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor enum {e2}; // expected-note 2{{unnamed type used in template argument was declared here}} 28d5fdd5afbbe57c31b84ecc1f422a9503baf64510Douglas Gregor enum {e3}; // expected-note{{unnamed type used in template argument was declared here}} 295e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor 305e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor template<typename T> struct X; 315e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor template<typename T> struct X<T*> { }; 325e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor 335e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor void f() { 345e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor f0( // expected-warning{{template argument uses unnamed type}} 355e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor &f1<__typeof__(e1)>); // expected-warning{{template argument uses unnamed type}} 365e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor int (*fp1)(int, __typeof__(e2)) = f1; // expected-warning{{template argument uses unnamed type}} 375e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor f1(e2); // expected-warning{{template argument uses unnamed type}} 385e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor f1(e2); 395e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor 40d5fdd5afbbe57c31b84ecc1f422a9503baf64510Douglas Gregor X<__typeof__(e3)*> x; // expected-warning{{template argument uses unnamed type}} 415e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor } 425e513042ca50f0c19e8fa66ced95d8043415b31cDouglas Gregor} 43