1// { dg-do compile } 2// Origin: <tilps at hotmail dot com> 3// c++/9154: poor error message for ">>" vs "> >" in template argument list 4 5 6/* 7 * Test that the error message is issued properly 8 */ 9template <class T> 10class A {}; 11 12A<A<int>> blah; // { dg-error "should be '> >' within" } 13A<int>> blah2; // { dg-error "spurious '>>'" } 14 15 16/* 17 * Test that a few valid constructs containing a ">>" token in a 18 * template argument list are handled correctly. 19 */ 20template <int N> 21void B(void) {} 22 23int Btest() 24{ 25 B<256 >> 4>(); 26} 27 28template <int N = 123>>4> 29struct C {}; 30 31template <int> struct D {}; 32template <typename> struct E {}; 33 34E<D< 1>>2 > > E1; 35 36const int x = 0; 37E<D< 1>>x > > E2; 38 39template <int> struct F { 40 typedef int I; 41}; 42 43template <typename T = F< 1>>2 >::I> 44struct G {}; 45 46/* 47 * In this special case, a valid type-id (H() is a function type) is followed 48 * by '>>', but the argument should still be parsed as an expression, which 49 * will then be rejected as non-constant expression. 50 */ 51struct H 52{ 53 int operator >>(int); 54}; 55 56template <int V> struct L {}; 57L<H() >> 5> l; // { dg-error "" "non-constant" } 58 59 60/* 61 * This case used to not emit the nice error message because of a typo 62 * in the code. 63 */ 64template <void (*)(void)> 65struct K {}; 66 67void KFunc(void); 68 69A<K<&KFunc>> k1; // { dg-error "" } 70K<&KFunc>> k2; // { dg-error "" } 71