1// RUN: %clang_cc1 -std=c++14 -fconcepts-ts -x c++ %s -verify
2// expected-no-diagnostics
3
4// Test parsing of the optional requires-clause in a template-declaration.
5
6template <typename T> requires true
7void foo() { }
8
9
10template <typename T> requires !0
11struct A {
12  void foo();
13  struct AA;
14  enum E : int;
15  static int x;
16
17  template <typename> requires true
18  void Mfoo();
19
20  template <typename> requires true
21  struct M;
22
23  template <typename> requires true
24  static int Mx;
25
26  template <typename TT> requires true
27  using MQ = M<TT>;
28};
29
30template <typename T> requires !0
31void A<T>::foo() { }
32
33template <typename T> requires !0
34struct A<T>::AA { };
35
36template <typename T> requires !0
37enum A<T>::E : int { E0 };
38
39template <typename T> requires !0
40int A<T>::x = 0;
41
42template <typename T> requires !0
43template <typename> requires true
44void A<T>::Mfoo() { }
45
46template <typename T> requires !0
47template <typename> requires true
48struct A<T>::M { };
49
50template <typename T> requires !0
51template <typename> requires true
52int A<T>::Mx = 0;
53
54
55template <typename T> requires true
56int x = 0;
57
58template <typename T> requires true
59using Q = A<T>;
60
61struct C {
62  template <typename> requires true
63  void Mfoo();
64
65  template <typename> requires true
66  struct M;
67
68  template <typename> requires true
69  static int Mx;
70
71  template <typename T> requires true
72  using MQ = M<T>;
73};
74
75template <typename> requires true
76void C::Mfoo() { }
77
78template <typename> requires true
79struct C::M { };
80
81template <typename> requires true
82int C::Mx = 0;
83