187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr300 { // dr300: yes
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename R, typename A> void f(R (&)(A)) {}
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int g(int);
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void h() { f(g); }
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr301 { // dr301: yes
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // see also dr38
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S;
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void operator+(T, T);
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void operator-(S, S);
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool a = (void(*)(S, S))operator+<S> <
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             (void(*)(S, S))operator+<S>;
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool b = (void(*)(S, S))operator- <
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             (void(*)(S, S))operator-;
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool c = (void(*)(S, S))operator+ <
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             (void(*)(S, S))operator-; // expected-error {{expected '>'}}
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void f() {
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typename T::template operator+<int> a; // expected-error {{typename specifier refers to a non-type template}} expected-error +{{}}
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This shouldn't say (null).
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    class T::template operator+<int> b; // expected-error {{identifier followed by '<' indicates a class template specialization but (null) refers to a function template}}
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    enum T::template operator+<int> c; // expected-error {{expected identifier}} expected-error {{does not declare anything}}
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    enum T::template operator+<int>::E d; // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}} expected-error {{forward reference}}
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    enum T::template X<int>::E e;
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T::template operator+<int>::foobar(); // expected-error {{qualified name refers into a specialization of function template 'T::template operator +'}}
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T::template operator+<int>(0); // ok
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> class operator&<T*> {}; // expected-error +{{}}
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> class T::operator& {}; // expected-error +{{}}
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> class S::operator&<T*> {}; // expected-error +{{}}
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr302 { // dr302: yes
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { A(); ~A(); };
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { // expected-error {{implicit default constructor for 'dr302::B' must explicitly initialize the const member 'n'}}
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int n; // expected-note {{declared here}}
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } b = B(); // expected-note {{first required here}}
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Trivial default constructor C::C() is not called here.
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C {
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int n;
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } c = C();
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}}
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A a;
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } b = B(); // expected-error {{call to implicitly-deleted default constructor}}
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // C::C() is called here, because even though it's trivial, it's deleted.
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C {
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int n; // expected-note {{deleted because field 'n' of const-qualified type 'const int' would not be initialized}}
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } c = C(); // expected-error {{call to implicitly-deleted default constructor}}
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct D {
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int n = 0;
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } d = D();
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr303: na
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr304 { // dr304: yes
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef int &a;
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int n = a(); // expected-error {{requires an initializer}}
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S { int &b; };
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int m = S().b;
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-3 {{requires an initializer}}
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-note@-3 {{in value-initialization}}
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{deleted}}
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-note@-7 {{reference}}
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr305 { // dr305: no
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef A C;
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f(A *a) {
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct A {};
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    a->~A();
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    a->~C();
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef A B;
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g(B *b) {
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    b->~B();
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    b->~C();
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void h(B *b) {
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct B {}; // expected-note {{declared here}}
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    b->~B(); // expected-error {{does not match}}
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct X {};
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void i(X<int>* x) {
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct X {};
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    x->~X<int>();
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    x->~X();
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    x->~X<char>(); // expected-error {{no member named}}
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct Y {
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> using T1 = Y;
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> using T2 = Y;
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void j(Y *y) {
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    y->~T1<int>();
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    y->~T2<int>();
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct Z {
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> using T2 = T;
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void k(Z *z) {
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This diagnostic is terrible.
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    z->~T1<int>(); // expected-error {{'T1' following the 'template' keyword does not refer to a template}} expected-error +{{}}
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    z->~T2<int>(); // expected-error {{no member named '~int'}}
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    z->~T2<Z>();
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: This is valid.
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace Q {
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename A> struct R {};
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename A> using R = Q::R<int>;
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void qr(Q::R<int> x) { x.~R<char>(); } // expected-error {{no member named}}
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr306 { // dr306: no
142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: dup 39
143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: This should be accepted.
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { struct B {}; }; // expected-note 2{{member}}
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C { typedef A::B B; }; // expected-note {{member}}
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct D : A, A::B, C {};
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  D::B b; // expected-error {{found in multiple base classes of different types}}
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr307: na
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr308 { // dr308: yes
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // This is mostly an ABI library issue.
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {};
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B : A {};
156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C : A {};
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct D : B, C {};
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    try {
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      throw D();
16158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    } catch (const A&) { // expected-note {{for type 'const dr308::A &'}}
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // unreachable
16358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    } catch (const B&) { // expected-warning {{exception of type 'const dr308::B &' will be caught by earlier handler}}
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // get here instead
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr309: dup 485
170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr311 { // dr311: yes
172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace X { namespace Y {} }
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  namespace X::Y {}
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus <= 201402L
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{define each namespace separately}}
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace X {
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    namespace X::Y {}
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#if __cplusplus <= 201402L
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // expected-error@-2 {{define each namespace separately}}
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#endif
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: The diagnostics here are not very good.
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace ::dr311::X {} // expected-error 2+{{}} // expected-warning {{extra qual}}
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr312: dup 616
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr313 { // dr313: dup 299 c++11
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { operator int() const; };
191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int *p = new int[A()];
192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: should this be available in c++98 mode? expected-error@-2 {{extension}}
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace dr314 { // FIXME 314: dup 1710
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct A {
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename U> struct B {};
200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct C : public A<T>::template B<T> {
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    C() : A<T>::template B<T>() {}
203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr315: na
207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr316: sup 1004
208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr317 { // dr317: 3.5
210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {} // expected-note {{previous}}
211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  inline void f(); // expected-error {{inline declaration of 'f' follows non-inline definition}}
212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int g();
214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int n = g();
215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  inline int g() { return 0; }
216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int h();
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int m = h();
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int h() { return 0; } // expected-note {{previous}}
220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  inline int h(); // expected-error {{inline declaration of 'h' follows non-inline definition}}
221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr318 { // dr318: sup 1310
224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {};
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A::A a;
226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr319 { // dr319: no
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: dup dr389
230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: We don't have a diagnostic for a name with linkage
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //        having a type without linkage.
232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef struct {
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int i;
234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } *ps;
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" void f(ps);
236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g(ps); // FIXME: ill-formed, type 'ps' has no linkage
237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static enum { e } a1;
239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum { e2 } a2; // FIXME: ill-formed, enum type has no linkage
240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum { n1 = 1u };
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef int (*pa)[n1];
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  pa parr; // ok, type has linkage despite using 'n1'
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename> struct X {};
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct A { int n; };
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern A a; // FIXME: ill-formed
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    X<A> xa;
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef A B;
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern B b; // FIXME: ill-formed
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    X<B> xb;
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const int n = 1;
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef int (*C)[n];
258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern C c; // ok
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    X<C> xc;
260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-12 {{uses local type 'A'}}
263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-9 {{uses local type 'A'}}
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr320 { // dr320: yes
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct X {
270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr X() {}
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    constexpr X(const X &x) : copies(x.copies + 1) {}
272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    unsigned copies = 0;
273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  constexpr X f(X x) { return x; }
275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  constexpr unsigned g(X x) { return x.copies; }
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static_assert(f(X()).copies == g(X()) + 1, "expected one extra copy for return value");
277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr321 { // dr321: dup 557
281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N {
282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int> struct A {
283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<int> struct B;
284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> template<> struct A<0>::B<0>;
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f(A<0>::B<0>);
287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> template<> struct N::A<0>::B<0> {};
289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void g(T t) { f(t); }
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void g(N::A<0>::B<0>);
292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N {
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename> struct I { friend bool operator==(const I&, const I&); };
295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  N::I<int> i, j;
297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool x = i == j;
298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr322 { // dr322: yes
301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> operator T&();
303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } a;
304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &r = static_cast<int&>(a);
305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &s = a;
306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr323: no
309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr324 { // dr324: yes
311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S { int n : 1; } s; // expected-note 3{{bit-field is declared here}}
312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &a = s.n; // expected-error {{non-const reference cannot bind to bit-field}}
313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int *b = &s.n; // expected-error {{address of bit-field}}
314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &c = (s.n = 0); // expected-error {{non-const reference cannot bind to bit-field}}
315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int *d = &(s.n = 0); // expected-error {{address of bit-field}}
316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &e = true ? s.n : s.n; // expected-error {{non-const reference cannot bind to bit-field}}
317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int *f = &(true ? s.n : s.n); // expected-error {{address of bit-field}}
318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &g = (void(), s.n); // expected-error {{non-const reference cannot bind to bit-field}}
319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int *h = &(void(), s.n); // expected-error {{address of bit-field}}
320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int *i = &++s.n; // expected-error {{address of bit-field}}
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr326 { // dr326: yes
324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {};
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int test[__is_trivially_constructible(S, const S&) ? 1 : -1];
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr327 { // dr327: dup 538
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A;
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class A {};
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class B;
333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {};
334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr328 { // dr328: yes
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A; // expected-note 3{{forward declaration}}
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { A a; }; // expected-error {{incomplete}}
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename> struct C { A a; }; // expected-error {{incomplete}}
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A *p = new A[0]; // expected-error {{incomplete}}
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr329 { // dr329: 3.5
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {};
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct A : B {
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend void f(A a) { g(a); }
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend void h(A a) { g(a); } // expected-error {{undeclared}}
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend void i(B b) {} // expected-error {{redefinition}} expected-note {{previous}}
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A<int> a;
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A<char> b; // expected-note {{instantiation}}
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void test() {
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    h(a); // expected-note {{instantiation}}
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr331 { // dr331: yes
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A(volatile A&); // expected-note {{candidate}}
361651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } const a, b(a); // expected-error {{no matching constructor}}
362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace dr332 { // dr332: dup 577
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}}
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g(const void); // expected-error {{'void' as parameter must not have type qualifiers}}
367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void h(int n, volatile void); // expected-error {{'void' must be the first and only parameter}}
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr333 { // dr333: yes
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int n = 0;
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int f(int(n));
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int g((int(n)));
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int h = f(g);
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr334 { // dr334: yes
378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void f() {
379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    T x;
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    f((x, 123));
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend S operator,(S, int);
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    friend void f(S);
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template void f<S>();
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr335: no
390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr336 { // dr336: yes
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace Pre {
393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<class T1> class A {
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<class T2> class B {
395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        template<class T3> void mf1(T3);
396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        void mf2();
397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      };
398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> template<class X> class A<int>::B {};
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {} // expected-error {{does not match}}
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}}
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace Post {
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<class T1> class A {
405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<class T2> class B {
406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        template<class T3> void mf1(T3);
407651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        void mf2();
408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      };
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
410651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> template<class X> class A<int>::B {
411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<class T> void mf1(T);
412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<> template<> template<class T> void A<int>::B<double>::mf1(T t) {}
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This diagnostic isn't very good.
415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<class Y> template<> void A<Y>::B<double>::mf2() {} // expected-error {{does not refer into a class}}
416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
417651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr337 { // dr337: yes
420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void f(T (*)[1]);
421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int &f(...);
422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { virtual ~A() = 0; };
424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &r = f<A>(0);
425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: The language rules here are completely broken. We cannot determine
427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // whether an incomplete type is abstract. See DR1640, which will probably
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // supersede this one and remove this rule.
429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B;
430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int &s = f<B>(0); // expected-error {{of type 'void'}}
431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { virtual ~B() = 0; };
432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr339 { // dr339: yes
435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <int I> struct A { static const int value = I; };
436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  char xxx(int);
438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  char (&xxx(float))[2];
439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<class T> A<sizeof(xxx((T)0))> f(T) {} // expected-note {{candidate}}
441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void test() {
443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A<1> a = f(0);
444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A<2> b = f(0.0f);
445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A<3> c = f("foo"); // expected-error {{no matching function}}
446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  char f(int);
450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int f(...);
451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <class T> struct conv_int {
453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static const bool value = sizeof(f(T())) == 1;
454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <class T> bool conv_int2(A<sizeof(f(T()))> p);
457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> A<sizeof(f(T()))> make_A();
459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int a[conv_int<char>::value ? 1 : -1];
461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool b = conv_int2<char>(A<1>());
462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A<1> c = make_A<char>();
463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr340 { // dr340: yes
466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { A(int); };
467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { B(A, A, int); };
468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int x, y;
469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  B b(A(x), A(y), 3);
470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr341 { // dr341: sup 1708
473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace A {
474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int n;
475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern "C" int &dr341_a = n; // expected-note {{previous}} expected-note {{declared with C language linkage here}}
476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace B {
478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern "C" int &dr341_a = dr341_a; // expected-error {{redefinition}}
479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" void dr341_b(); // expected-note {{declared with C language linkage here}}
481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_a; // expected-error {{declaration of 'dr341_a' in global scope conflicts with declaration with C language linkage}}
483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_b; // expected-error {{declaration of 'dr341_b' in global scope conflicts with declaration with C language linkage}}
484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_c; // expected-note {{declared in global scope here}}
485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint dr341_d; // expected-note {{declared in global scope here}}
486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr341 {
487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" int dr341_c; // expected-error {{declaration of 'dr341_c' with C language linkage conflicts with declaration in global scope}}
488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" void dr341_d(); // expected-error {{declaration of 'dr341_d' with C language linkage conflicts with declaration in global scope}}
489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace A { extern "C" int dr341_e; } // expected-note {{previous}}
491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace B { extern "C" void dr341_e(); } // expected-error {{redefinition of 'dr341_e' as different kind of symbol}}
492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr342: na
495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4960e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace dr343 { // FIXME 343: no
497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: dup 1710
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct A {
499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename U> struct B {};
500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: In these contexts, the 'template' keyword is optional.
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct C : public A<T>::B<T> { // expected-error {{use 'template'}}
503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    C() : A<T>::B<T>() {} // expected-error {{use 'template'}}
504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr344 { // dr344: dup 1435
508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { inline virtual ~A(); };
509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { friend A::~A(); };
510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr345 { // dr345: yes
513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct X {};
515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int X; // expected-note {{here}}
516651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct X {};
519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <class T> void f(T t) { typename T::X x; } // expected-error {{refers to non-type member 'X'}}
521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f(A a, B b) {
522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    f(b);
523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    f(a); // expected-note {{instantiation}}
524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr346: na
528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr347 { // dr347: yes
530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct base {
531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct nested;
532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static int n;
533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static void f();
534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void g();
535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct derived : base {};
538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct derived::nested {}; // expected-error {{no struct named 'nested'}}
540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int derived::n; // expected-error {{no member named 'n'}}
541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void derived::f() {} // expected-error {{does not match any}}
542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void derived::g() {} // expected-error {{does not match any}}
543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr348: na
546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr349 { // dr349: no
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> operator T ***() {
550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      int ***p = 0;
551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return p; // expected-error {{cannot initialize return object of type 'const int ***' with an lvalue of type 'int ***'}}
552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: This is valid.
556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A a;
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const int *const *const *p1 = a; // expected-note {{in instantiation of}}
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> operator T ***() {
561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      const int ***p = 0;
562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return p;
563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: This is invalid.
567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  B b;
568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const int *const *const *p2 = b;
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr351: na
572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr352 { // dr352: yes
574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example1 {
575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    namespace A {
576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      enum E {};
577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      template<typename R, typename A> void foo(E, R (*)(A)); // expected-note 2{{couldn't infer template argument 'R'}}
578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> void arg(T);
581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> int arg(T) = delete; // expected-note {{here}} expected-error 0-1{{extension}}
582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f(A::E e) {
584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      foo(e, &arg); // expected-error {{no matching function}}
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      using A::foo;
587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      foo<int, int>(e, &arg); // expected-error {{deleted}}
588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int arg(int);
591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void g(A::E e) {
593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      foo(e, &arg); // expected-error {{no matching function}}
594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      using A::foo;
596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      foo<int, int>(e, &arg); // ok, uses non-template
597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace contexts {
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void f1(int (&)[I]);
602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void f2(int (&)[I+1]); // expected-note {{couldn't infer}}
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void f3(int (&)[I+1], int (&)[I]);
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f() {
605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      int a[4];
606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      int b[3];
607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      f1(a);
608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      f2(a); // expected-error {{no matching function}}
609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      f3(a, b);
610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> struct S {};
613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void g1(S<I>);
614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void g2(S<I+1>); // expected-note {{couldn't infer}}
615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void g3(S<I+1>, S<I>);
616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void g() {
617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      S<4> a;
618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      S<3> b;
619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      g1(a);
620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      g2(a); // expected-error {{no matching function}}
621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      g3(a, b);
622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> void h1(T = 0); // expected-note {{couldn't infer}}
625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> void h2(T, T = 0);
626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void h() {
627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      h1(); // expected-error {{no matching function}}
628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      h1(0);
629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      h1<int>();
630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      h2(0);
631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> int tmpl(T);
634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename R, typename A> void i1(R (*)(A)); // expected-note 3{{couldn't infer}}
635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename R, typename A> void i2(R, A, R (*)(A)); // expected-note {{not viable}}
636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void i() {
637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      extern int single(int);
638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i1(single);
639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i2(0, 0, single);
640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      extern int ambig(float), ambig(int);
642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i1(ambig); // expected-error {{no matching function}}
643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i2(0, 0, ambig);
644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      extern void no_match(float), no_match(int);
646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i1(no_match); // expected-error {{no matching function}}
647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i2(0, 0, no_match); // expected-error {{no matching function}}
648651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
649651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i1(tmpl); // expected-error {{no matching function}}
650651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      i2(0, 0, tmpl);
651651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
653651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
654651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct is_int;
655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> struct is_int<int> {};
656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example2 {
658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> int f(T (*p)(T)) { is_int<T>(); }
659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int g(int);
660651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int g(char);
661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int i = f(g);
662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example3 {
665651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> int f(T, T (*p)(T)) { is_int<T>(); }
666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int g(int);
667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    char g(char);
668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int i = f(1, g);
669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example4 {
672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> int f(T, T (*p)(T)) { is_int<T>(); }
673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    char g(char);
674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> T g(T);
675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int i = f(1, g);
676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example5 {
679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> class A {};
680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void g(A<I+1>); // expected-note {{couldn't infer}}
681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<int I> void f(A<I>, A<I+1>);
682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void h(A<1> a1, A<2> a2) {
683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      g(a1); // expected-error {{no matching function}}
684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      g<0>(a1);
685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      f(a1, a2);
686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr353 needs an IRGen test.
691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
692651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr354 { // dr354: yes c++11
693651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: Should we allow this in C++98 too?
694651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {};
695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template<int*> struct ptr {}; // expected-note 0-4{{here}}
697651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr<0> p0;
698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr<(int*)0> p1;
699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr<(float*)0> p2;
700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr<(int S::*)0> p3;
701651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
702651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{does not refer to any decl}}
703651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{does not refer to any decl}}
704651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{does not refer to any decl}}
705651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{does not refer to any decl}}
7060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#elif __cplusplus <= 201402L
707651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-10 {{must be cast}}
708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // ok
709651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-10 {{does not match}}
710651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-10 {{does not match}}
7110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#else
7120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-15 {{conversion from 'int' to 'int *' is not allowed}}
7130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // ok
7140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-15 {{'float *' is not implicitly convertible to 'int *'}}
7150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-15 {{'int dr354::S::*' is not implicitly convertible to 'int *'}}
716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<int*> int both();
719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<int> int both();
720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int b0 = both<0>();
721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int b1 = both<(int*)0>();
722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-2 {{no matching function}}
724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-note@-6 {{candidate}}
725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-note@-6 {{candidate}}
726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template<int S::*> struct ptr_mem {}; // expected-note 0-4{{here}}
729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr_mem<0> m0;
730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr_mem<(int S::*)0> m1;
731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr_mem<(float S::*)0> m2;
732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ptr_mem<(int *)0> m3;
733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{cannot be converted}}
735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{is not a pointer to member constant}}
736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{cannot be converted}}
737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-5 {{cannot be converted}}
7380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#elif __cplusplus <= 201402L
739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-10 {{must be cast}}
740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // ok
741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-10 {{does not match}}
742651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-10 {{does not match}}
7430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#else
7440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-15 {{conversion from 'int' to 'int dr354::S::*' is not allowed}}
7450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // ok
7460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-15 {{'float dr354::S::*' is not implicitly convertible to 'int dr354::S::*'}}
7470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // expected-error@-15 {{'int *' is not implicitly convertible to 'int dr354::S::*'}}
748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct dr355_S; // dr355: yes
752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct ::dr355_S {}; // expected-warning {{extra qualification}}
753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr355 { struct ::dr355_S s; }
754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr356: na
756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr357 { // dr357: yes
758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> struct A {
759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f() const; // expected-note {{const qualified}}
760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void A<T>::f() {} // expected-error {{does not match}}
762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {
764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> void f();
765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void B::f() const {} // expected-error {{does not match}}
767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
769651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr358 { // dr358: yes
770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" void dr358_f();
771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N {
772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int var;
773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern "C" void dr358_f() { var = 10; }
774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr359 { // dr359: yes
778651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Note, the example in the DR is wrong; it doesn't contain an anonymous
779651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // union.
780651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct E {
781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    union {
782651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      struct {
783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        int x;
784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } s;
785651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } v;
786651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    union {
788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      struct { // expected-error {{extension}}
789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        int x;
790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } s;
791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      struct S { // expected-error {{types cannot be declared in an anonymous union}}
793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        int x;
794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } t;
795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      union { // expected-error {{extension}}
797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        int u;
798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      };
799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
803651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr362: na
804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr363: na
805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr364 { // dr364: yes
807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {
808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static void f(int);
809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f(char);
810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void g() {
813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    S::f('a'); // expected-error {{call to non-static}}
814651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    S::f(0);
815651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
816651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if "foo" // expected-error {{invalid token}} dr366: yes
819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr367 { // dr367: yes
822651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: These diagnostics are terrible. Don't diagnose an ill-formed global
823651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // array as being a VLA!
824651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int a[true ? throw 0 : 4]; // expected-error 2{{variable length array}}
825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int b[true ? 4 : throw 0];
826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int c[true ? *new int : 4]; // expected-error 2{{variable length array}}
827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int d[true ? 4 : *new int];
828651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-4 {{variable length array}} expected-error@-4 {{constant expression}}
830651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-3 {{variable length array}} expected-error@-3 {{constant expression}}
831651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
832651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
833651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
834651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr368 { // dr368: yes
835651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T, T> struct S {}; // expected-note {{here}}
836651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int f(S<T, T()> *); // expected-error {{function type}}
837651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //template<typename T> int g(S<T, (T())> *); // FIXME: crashes clang
838651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> int g(S<T, true ? T() : T()> *); // expected-note {{cannot have type 'dr368::X'}}
839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct X {};
840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int n = g<X>(0); // expected-error {{no matching}}
841651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
842651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
843651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr370: na
844651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
845651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr372 { // dr372: no
846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example1 {
847651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct X {
848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    protected:
849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typedef T Type; // expected-note 2{{protected}}
850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
851651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct Y {};
852651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: These two are valid; deriving from T1<T> gives Z1 access to
854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // the protected member T1<T>::Type.
855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T,
856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             template<typename> class T1,
857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             template<typename> class T2> struct Z1 :
858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      T1<T>,
859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      T2<typename T1<T>::Type> {}; // expected-error {{protected}}
860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T,
862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             template<typename> class T1,
863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             template<typename> class T2> struct Z2 :
864651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      T2<typename T1<T>::Type>, // expected-error {{protected}}
865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      T1<T> {};
866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
867651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Z1<int, X, Y> z1; // expected-note {{instantiation of}}
868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Z2<int, X, Y> z2; // expected-note {{instantiation of}}
869651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
871651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example2 {
872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct X {
873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    private:
874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typedef int Type; // expected-note {{private}}
875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct A {
877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typename T::Type t; // expected-error {{private}}
878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A<X> ax; // expected-note {{instantiation of}}
880651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
881651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example3 {
883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct A {
884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    protected:
885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typedef int N; // expected-note 2{{protected}}
886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
887651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
888651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct B {};
889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename U> struct C : U, B<typename U::N> {}; // expected-error {{protected}}
890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename U> struct D : B<typename U::N>, U {}; // expected-error {{protected}}
891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    C<A> x; // expected-note {{instantiation of}}
893651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    D<A> y; // expected-note {{instantiation of}}
894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example4 {
897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    class A {
898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      class B {};
899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      friend class X;
900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct X : A::B {
903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      A::B mx;
904651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      class Y {
905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        A::B my;
906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      };
907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
908651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
911651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr373 { // dr373: no
912651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: This is valid.
913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace X { int dr373; } // expected-note 2{{here}}
914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct dr373 { // expected-note {{here}}
915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f() {
916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      using namespace dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}}
917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      int k = dr373; // expected-error {{does not refer to a value}}
918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      namespace Y = dr373::X; // expected-error {{no namespace named 'X' in 'dr373::dr373'}}
920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      k = Y::dr373;
921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr374 { // dr374: yes c++11
926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N {
927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> void f();
928651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct A { void f(); };
929651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
930651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> void N::f<char>() {}
931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> void N::A<char>::f() {}
932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<> struct N::A<int> {};
933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-4 {{extension}} expected-note@-7 {{here}}
935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-4 {{extension}} expected-note@-7 {{here}}
936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-4 {{extension}} expected-note@-8 {{here}}
937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
940651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr375: dup 345
941651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr376: na
942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr377 { // dr377: yes
944651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum E { // expected-error {{enumeration values exceed range of largest integer}}
945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    a = -__LONG_LONG_MAX__ - 1, // expected-error 0-1{{extension}}
946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    b = 2 * (unsigned long long)__LONG_LONG_MAX__ // expected-error 0-2{{extension}}
947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
948651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
949651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr378: dup 276
951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr379: na
952651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
953651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr381 { // dr381: yes
954651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
955651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int a;
956651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
957651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B : virtual A {};
958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C : B {};
959651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct D : B {};
960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct E : public C, public D {};
961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct F : public A {};
962651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {
963651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    E e;
964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    e.B::a = 0; // expected-error {{ambiguous conversion}}
965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    F f;
966651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    f.A::a = 1;
967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
968651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr382 { // dr382: yes c++11
971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: Should we allow this in C++98 mode?
972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { typedef int T; };
973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typename A::T t;
974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typename dr382::A a;
975651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-3 {{occurs outside of a template}}
977651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-3 {{occurs outside of a template}}
978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
979651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typename A b; // expected-error {{expected a qualified name}}
980651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
981651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
982651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr383 { // dr383: yes
983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { A &operator=(const A&); };
984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { ~B(); };
985651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  union C { C &operator=(const C&); };
986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  union D { ~D(); };
987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int check[(__is_pod(A) || __is_pod(B) || __is_pod(C) || __is_pod(D)) ? -1 : 1];
988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr384 { // dr384: yes
991651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N1 {
992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct Base {};
993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> struct X {
994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      struct Y : public Base<T> {
995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Y operator+(int) const;
996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      };
997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Y f(unsigned i) { return Y() + i; }
998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace N2 {
1002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct Z {};
1003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> int *operator+(T, unsigned);
1004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int main() {
1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    N1::X<N2::Z> v;
1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    v.f(0);
1009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr385 { // dr385: yes
1013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A { protected: void f(); };
1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B : A { using A::f; };
1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C : A { void g(B b) { b.f(); } };
1016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void h(B b) { b.f(); }
1017651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct D { int n; }; // expected-note {{member}}
1019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct E : protected D {}; // expected-note 2{{protected}}
1020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct F : E { friend int i(E); };
1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int i(E e) { return e.n; } // expected-error {{protected base}} expected-error {{protected member}}
1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr387 { // dr387: yes
1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace old {
1026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<typename T> class number {
1027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      number(int); // expected-note 2{{here}}
1028651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      friend number gcd(number &x, number &y) {}
1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void g() {
1032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      number<double> a(3), b(4); // expected-error 2{{private}}
1033651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      a = gcd(a, b);
1034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      b = gcd(3, 4); // expected-error {{undeclared}}
1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace newer {
1039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T> class number {
1040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    public:
1041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      number(int);
1042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      friend number gcd(number x, number y) { return 0; }
1043651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void g() {
1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      number<double> a(3), b(4);
1047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      a = gcd(a, b);
1048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      b = gcd(3, 4); // expected-error {{undeclared}}
1049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: dr388 needs codegen test
1054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1055651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr389 { // dr389: no
1056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {
1057651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef struct {} A;
1058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef enum {} B;
1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef struct {} const C; // expected-note 0-2{{here}}
1060651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    typedef enum {} const D; // expected-note 0-1{{here}}
1061651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
1062651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename> struct T {};
1063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct WithLinkage1 {};
1065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  enum WithLinkage2 {};
1066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef struct {} *WithLinkage3a, WithLinkage3b;
1067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef enum {} WithLinkage4a, *WithLinkage4b;
1068651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef S::A WithLinkage5;
1069651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef const S::B WithLinkage6;
1070651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef int WithLinkage7;
1071651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef void (*WithLinkage8)(WithLinkage2 WithLinkage1::*, WithLinkage5 *);
1072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage5> WithLinkage9;
1073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef struct {} *WithoutLinkage1; // expected-note 0-1{{here}}
1075651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef enum {} const WithoutLinkage2; // expected-note 0-1{{here}}
1076651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // These two types don't have linkage even though they are externally visible
1077651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // and the ODR requires them to be merged across TUs.
1078651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef S::C WithoutLinkage3;
1079651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef S::D WithoutLinkage4;
1080651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef void (*WithoutLinkage5)(int (WithoutLinkage3::*)(char));
1081651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
1083651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // This has linkage even though its template argument does not.
1084651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: This is probably a defect.
1085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithoutLinkage1> WithLinkage10;
1086651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else
1087651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef int WithLinkage10; // dummy
1088651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1089651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage1> GoodArg1;
1090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage2> GoodArg2;
1091651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage3a> GoodArg3a;
1092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage3b> GoodArg3b;
1093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage4a> GoodArg4a;
1094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage4b> GoodArg4b;
1095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage5> GoodArg5;
1096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage6> GoodArg6;
1097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage7> GoodArg7;
1098651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage8> GoodArg8;
1099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithLinkage9> GoodArg9;
1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithoutLinkage1> BadArg1; // expected-error{{template argument uses}}
1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithoutLinkage2> BadArg2; // expected-error{{template argument uses}}
1103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithoutLinkage3> BadArg3; // expected-error{{template argument uses}}
1104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithoutLinkage4> BadArg4; // expected-error{{template argument uses}}
1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef T<WithoutLinkage5> BadArg5; // expected-error{{template argument uses}}
1106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
1107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage1 withLinkage1;
1109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage2 withLinkage2;
1110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage3a withLinkage3a;
1111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage3b withLinkage3b;
1112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage4a withLinkage4a;
1113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage4b withLinkage4b;
1114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage5 withLinkage5;
1115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage6 withLinkage6;
1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage7 withLinkage7;
1117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage8 withLinkage8;
1118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage9 withLinkage9;
1119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithLinkage10 withLinkage10;
1120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: These are all ill-formed.
1122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithoutLinkage1 withoutLinkage1;
1123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithoutLinkage2 withoutLinkage2;
1124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithoutLinkage3 withoutLinkage3;
1125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithoutLinkage4 withoutLinkage4;
1126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern WithoutLinkage5 withoutLinkage5;
1127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // OK, extern "C".
1129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" {
1130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern WithoutLinkage1 dr389_withoutLinkage1;
1131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern WithoutLinkage2 dr389_withoutLinkage2;
1132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern WithoutLinkage3 dr389_withoutLinkage3;
1133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern WithoutLinkage4 dr389_withoutLinkage4;
1134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern WithoutLinkage5 dr389_withoutLinkage5;
1135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // OK, defined.
1138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  WithoutLinkage1 withoutLinkageDef1;
1139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  WithoutLinkage2 withoutLinkageDef2 = WithoutLinkage2();
1140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  WithoutLinkage3 withoutLinkageDef3 = {};
1141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  WithoutLinkage4 withoutLinkageDef4 = WithoutLinkage4();
1142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  WithoutLinkage5 withoutLinkageDef5;
1143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void use(const void *);
1145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void use_all() {
1146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withLinkage1); use(&withLinkage2); use(&withLinkage3a); use(&withLinkage3b);
1147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withLinkage4a); use(&withLinkage4b); use(&withLinkage5); use(&withLinkage6);
1148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withLinkage7); use(&withLinkage8); use(&withLinkage9); use(&withLinkage10);
1149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withoutLinkage1); use(&withoutLinkage2); use(&withoutLinkage3);
1151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withoutLinkage4); use(&withoutLinkage5);
1152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&dr389_withoutLinkage1); use(&dr389_withoutLinkage2);
1154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&dr389_withoutLinkage3); use(&dr389_withoutLinkage4);
1155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&dr389_withoutLinkage5);
1156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withoutLinkageDef1); use(&withoutLinkageDef2); use(&withoutLinkageDef3);
1158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    use(&withoutLinkageDef4); use(&withoutLinkageDef5);
1159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void local() {
1162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This is ill-formed.
1163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    extern WithoutLinkage1 withoutLinkageLocal;
1164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr390 { // dr390: yes
1168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T>
1169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct A {
1170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    A() { f(); } // expected-warning {{call to pure virt}}
1171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    virtual void f() = 0; // expected-note {{here}}
1172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    virtual ~A() = 0;
1173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
1174651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> A<T>::~A() { T::error; } // expected-error {{cannot be used prior to}}
1175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T> void A<T>::f() { T::error; } // ok, not odr-used
1176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B : A<int> { // expected-note 2{{in instantiation of}}
1177651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void f() {}
1178651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } b;
1179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr391 { // dr391: yes c++11
1182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: Should this apply to C++98 too?
1183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class A { A(const A&); }; // expected-note 0-1{{here}}
1184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  A fa();
1185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const A &a = fa();
1186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
1187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-2 {{C++98 requires an accessible copy constructor}}
1188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
1189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B { B(const B&) = delete; }; // expected-error 0-1{{extension}} expected-note 0-1{{here}}
1191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  B fb();
1192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const B &b = fb();
1193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus < 201103L
1194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-2 {{deleted}}
1195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
1196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename T>
1198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct C {
1199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    C(const C&) { T::error; }
1200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
1201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  C<int> fc();
1202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const C<int> &c = fc();
1203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr392 FIXME write codegen test
1206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr394: na
1207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr395 { // dr395: yes
1209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S {
12100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    template <typename T, int N>(&operator T())[N]; // expected-error {{cannot specify any part of a return type}}
1211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T, int N> operator(T (&)[N])(); // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error +{{}}
1212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T> operator T *() const { return 0; }
1213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T, typename U> operator T U::*() const { return 0; }
1214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T, typename U> operator T (U::*)()() const { return 0; } // expected-error +{{}}
1215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
1216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct null1_t {
1218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T, class U> struct ptr_mem_fun_t {
1219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typedef T (U::*type)();
1220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T, class U>
1223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    operator typename ptr_mem_fun_t<T, U>::type() const { // expected-note {{couldn't infer}}
1224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return 0;
1225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } null1;
1227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int (S::*p)() = null1; // expected-error {{no viable conversion}}
1228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template <typename T> using id = T; // expected-error 0-1{{extension}}
1230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct T {
1232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T, int N> operator id<T[N]> &();
1233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T, typename U> operator id<T (U::*)()>() const;
1234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
1235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct null2_t {
1237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<class T, class U> using ptr_mem_fun_t = T (U::*)(); // expected-error 0-1{{extension}}
1238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template<class T, class U> operator ptr_mem_fun_t<T, U>() const { return 0; };
1239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } null2;
1240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int (S::*q)() = null2;
1241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr396 { // dr396: yes
1244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f() {
1245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto int a(); // expected-error {{storage class on function}}
1246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int (i); // expected-note {{previous}}
1247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    auto int (i); // expected-error {{redefinition}}
1248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
1249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // expected-error@-4 {{'auto' storage class}} expected-error@-2 {{'auto' storage class}}
1250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
1251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr397: sup 1823
1255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr398 { // dr398: yes
1257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example1 {
1258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct S {
1259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      static int const I = 42;
1260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <int N> struct X {};
1262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T> void f(X<T::I> *) {}
1263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <typename T> void f(X<T::J> *) {}
1264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void foo() { f<S>(0); }
1265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  namespace example2 {
1268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <int I> struct X {};
1269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <template <class T> class> struct Z {};
1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> void f(typename T::Y *) {} // expected-note 2{{substitution failure}}
1271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> void g(X<T::N> *) {} // expected-note {{substitution failure}}
1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    template <class T> void h(Z<T::template TT> *) {} // expected-note {{substitution failure}}
1273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct A {};
1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct B {
1275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      int Y;
1276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct C {
1278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typedef int N;
1279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    struct D {
1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      typedef int TT;
1282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
1283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void test() {
1285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      f<A>(0); // expected-error {{no matching function}}
1286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      f<B>(0); // expected-error {{no matching function}}
1287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      g<C>(0); // expected-error {{no matching function}}
1288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      h<D>(0); // expected-error {{no matching function}}
1289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1292