13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 27429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregortemplate<typename T, typename U = const T> struct Def1; 37429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor 47429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregortemplate<> struct Def1<int> { 57429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor void foo(); 67429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor}; 77429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor 87429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregortemplate<> struct Def1<const int> { // expected-note{{previous definition is here}} 97429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor void bar(); 107429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor}; 117429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor 12f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def1<int&> { 13f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void wibble(); 14f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 15f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 16f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregorvoid test_Def1(Def1<int, const int> *d1, Def1<const int, const int> *d2, 17f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor Def1<int&, int&> *d3) { 187429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor d1->foo(); 197429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor d2->bar(); 20f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d3->wibble(); 21f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor} 22f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 23f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<typename T, // FIXME: bad error message below, needs better location info 24f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor typename T2 = const T*> // expected-error{{'T2' declared as a pointer to a reference}} 25f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor struct Def2; 26f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 27f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def2<int> { 28f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void foo(); 29f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 30f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 31f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregorvoid test_Def2(Def2<int, int const*> *d2) { 32f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d2->foo(); 337429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor} 347429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor 3556d25a726f0bdb4db08021b9e98782ada5241eafDouglas Gregortypedef int& int_ref_t; 3656d25a726f0bdb4db08021b9e98782ada5241eafDouglas GregorDef2<int_ref_t> *d2; // expected-note{{in instantiation of default argument for 'Def2<int &>' required here}} 37f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 38f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 3903028a90c18c484ab477e6535441ec5825a7328aChris Lattnertemplate<> struct Def1<const int, const int> { }; // expected-error{{redefinition of 'Def1<const int>'}} 407429654ea581f10ed2ddb400efddad928bd5a051Douglas Gregor 41f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<typename T, typename T2 = T&> struct Def3; 42f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 43f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def3<int> { 44f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void foo(); 45f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 46f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 47f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def3<int&> { 48f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void bar(); 49f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 50f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 51f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregorvoid test_Def3(Def3<int, int&> *d3a, Def3<int&, int&> *d3b) { 52f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d3a->foo(); 53f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d3b->bar(); 54f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor} 55f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 56f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 57f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<typename T, typename T2 = T[]> struct Def4; 58f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 59f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def4<int> { 60f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void foo(); 61f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 62f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 63f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregorvoid test_Def4(Def4<int, int[]> *d4a) { 64f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d4a->foo(); 65f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor} 66f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 67f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<typename T, typename T2 = T const[12]> struct Def5; 68f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 69f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def5<int> { 70f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void foo(); 71f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 72f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 73f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregortemplate<> struct Def5<int, int const[13]> { 74f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor void bar(); 75f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor}; 76f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 77f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregorvoid test_Def5(Def5<int, const int[12]> *d5a, Def5<int, const int[13]> *d5b) { 78f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d5a->foo(); 79f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor d5b->bar(); 80f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor} 81f57dcd00b6b3b9eb4e02ae699618dbb8015db950Douglas Gregor 82c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregortemplate<typename R, typename Arg1, typename Arg2 = Arg1, 83c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor typename FuncType = R (*)(Arg1, Arg2)> 84c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor struct Def6; 85c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor 86c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregortemplate<> struct Def6<int, float> { 87c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor void foo(); 88c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor}; 89c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor 90c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregortemplate<> struct Def6<bool, int[5], float(double, double)> { 91c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor void bar(); 92c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor}; 93c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor 94c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregorbool test_Def6(Def6<int, float, float> *d6a, 95c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor Def6<int, float, float, int (*)(float, float)> *d6b, 96c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor Def6<bool, int[5], float(double, double), 97c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor bool(*)(int*, float(*)(double, double))> *d6c) { 98c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor d6a->foo(); 99c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor d6b->foo(); 100c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor d6c->bar(); 101c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor return d6a == d6b; 102c0139cac0ce30f7fd36fd739e361dd49635b325eDouglas Gregor} 103