1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3template<typename T> struct A {};
4
5// Check for template argument lists followed by junk
6// FIXME: The diagnostics here aren't great...
7A<int+> int x; // expected-error {{expected '>'}} expected-error {{expected unqualified-id}}
8A<int x; // expected-error {{expected '>'}}
9
10// PR8912
11template <bool> struct S {};
12S<bool(2 > 1)> s;
13
14// Test behavior when a template-id is ended by a token which starts with '>'.
15namespace greatergreater {
16  template<typename T> struct S { S(); S(T); };
17  void f(S<int>=0); // expected-error {{a space is required between a right angle bracket and an equals sign (use '> =')}}
18  void f(S<S<int>>=S<int>()); // expected-error {{use '> >'}} expected-error {{use '> ='}}
19  template<typename T> void t();
20  void g() {
21    void (*p)() = &t<int>;
22    (void)(&t<int>==p); // expected-error {{use '> ='}}
23    (void)(&t<int>>=p); // expected-error {{use '> >'}}
24    (void)(&t<S<int>>>=p); // expected-error {{use '> >'}}
25    (void)(&t<S<int>>==p); // expected-error {{use '> >'}} expected-error {{use '> ='}}
26  }
27}
28
29namespace PR5925 {
30  template <typename x>
31  class foo { // expected-note {{here}}
32  };
33  void bar(foo *X) { // expected-error {{requires template arguments}}
34  }
35}
36
37namespace PR13210 {
38  template <class T>
39  class C {}; // expected-note {{here}}
40
41  void f() {
42    new C(); // expected-error {{requires template arguments}}
43  }
44}
45