// { dg-do compile } // { dg-options "-std=gnu++98" } // Origin: // c++/9154: poor error message for ">>" vs "> >" in template argument list /* * Test that the error message is issued properly */ template class A {}; A> blah; // { dg-error "should be '> >' within" } A> blah2; // { dg-error "spurious '>>'" } /* * Test that a few valid constructs containing a ">>" token in a * template argument list are handled correctly. */ template void B(void) {} int Btest() { B<256 >> 4>(); } template >4> struct C {}; template struct D {}; template struct E {}; E>2 > > E1; const int x = 0; E>x > > E2; template struct F { typedef int I; }; template >2 >::I> struct G {}; /* * In this special case, a valid type-id (H() is a function type) is followed * by '>>', but the argument should still be parsed as an expression, which * will then be rejected as non-constant expression. */ struct H { int operator >>(int); }; template struct L {}; L> 5> l; // { dg-error "" "non-constant" } /* * This case used to not emit the nice error message because of a typo * in the code. */ template struct K {}; void KFunc(void); A> k1; // { dg-error "" } K<&KFunc>> k2; // { dg-error "" }