1e83b4eb1cf3dd67f3f3700af3e498641268b50c7NAKAMURA Takumi// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
2e83b4eb1cf3dd67f3f3700af3e498641268b50c7NAKAMURA Takumi// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
5ed7dc87192784841839908a88b6d0623f6278408Richard Smith
6ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr100 { // dr100: yes
70e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template<const char *> struct A {}; // expected-note 0-1{{declared here}}
80e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template<const char (&)[4]> struct B {}; // expected-note 0-1{{declared here}}
9ed7dc87192784841839908a88b6d0623f6278408Richard Smith  A<"foo"> a; // expected-error {{does not refer to any declaration}}
10ed7dc87192784841839908a88b6d0623f6278408Richard Smith  B<"bar"> b; // expected-error {{does not refer to any declaration}}
11ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
12ed7dc87192784841839908a88b6d0623f6278408Richard Smith
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr101 { // dr101: 3.5
14662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  extern "C" void dr101_f();
15ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef unsigned size_t;
16ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace X {
17662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    extern "C" void dr101_f();
18ed7dc87192784841839908a88b6d0623f6278408Richard Smith    typedef unsigned size_t;
19ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
20662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  using X::dr101_f;
21ed7dc87192784841839908a88b6d0623f6278408Richard Smith  using X::size_t;
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern "C" void dr101_f();
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef unsigned size_t;
24ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
25ed7dc87192784841839908a88b6d0623f6278408Richard Smith
26ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr102 { // dr102: yes
27ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace A {
28ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> T f(T a, T b) { return a + b; } // expected-error {{neither visible in the template definition nor found by argument-dependent lookup}}
29ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
30ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace B {
31ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct S {};
32ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
33ed7dc87192784841839908a88b6d0623f6278408Richard Smith  B::S operator+(B::S, B::S); // expected-note {{should be declared prior to the call site or in namespace 'dr102::B'}}
34ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template B::S A::f(B::S, B::S); // expected-note {{in instantiation of}}
35ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
36ed7dc87192784841839908a88b6d0623f6278408Richard Smith
37ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr103: na
38ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr104 FIXME: add codegen test
39ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr105: na
40ed7dc87192784841839908a88b6d0623f6278408Richard Smith
41ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr106 { // dr106: sup 540
42ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef int &r1;
43ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef r1 &r1;
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef const r1 r1; // expected-warning {{has no effect}}
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef const r1 &r1; // expected-warning {{has no effect}}
46ed7dc87192784841839908a88b6d0623f6278408Richard Smith
47ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef const int &r2;
48ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef r2 &r2;
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef const r2 r2; // expected-warning {{has no effect}}
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef const r2 &r2; // expected-warning {{has no effect}}
51ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
52ed7dc87192784841839908a88b6d0623f6278408Richard Smith
53ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr107 { // dr107: yes
54ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct S {};
55ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern "C" S operator+(S, S) { return S(); }
56ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
57ed7dc87192784841839908a88b6d0623f6278408Richard Smith
58ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr108 { // dr108: yes
59ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct A {
60ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct B { typedef int X; };
61ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B::X x; // expected-error {{missing 'typename'}}
62ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct C : B { X x; }; // expected-error {{unknown type name}}
63ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
64ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<> struct A<int>::B { int X; };
65ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
66ed7dc87192784841839908a88b6d0623f6278408Richard Smith
67ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr109 { // dr109: yes
68ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A { template<typename T> void f(T); };
69ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct B : T {
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using T::template f; // expected-error {{using declaration cannot refer to a template}}
71ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void g() { this->f<int>(123); } // expected-error {{use 'template'}}
72ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
73ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
74ed7dc87192784841839908a88b6d0623f6278408Richard Smith
75ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr111 { // dr111: dup 535
76ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A { A(); A(volatile A&, int = 0); A(A&, const char * = "foo"); };
77743cbb91499e138a63a398c6515667905f1b3be8Richard Smith  struct B : A { B(); }; // expected-note +{{would lose const qualifier}} expected-note {{requires 0 arguments}}
78ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const B b1;
79ed7dc87192784841839908a88b6d0623f6278408Richard Smith  B b2(b1); // expected-error {{no matching constructor}}
80ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
81ed7dc87192784841839908a88b6d0623f6278408Richard Smith
82ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr112 { // dr112: yes
83ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct T { int n; };
84ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef T Arr[1];
85ed7dc87192784841839908a88b6d0623f6278408Richard Smith
86ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const T a1[1] = {};
87ed7dc87192784841839908a88b6d0623f6278408Richard Smith  volatile T a2[1] = {};
88ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const Arr a3 = {};
89ed7dc87192784841839908a88b6d0623f6278408Richard Smith  volatile Arr a4 = {};
90ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<const volatile T*> struct X {};
91ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a1> x1;
92ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a2> x2;
93ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a3> x3;
94ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a4> x4;
95ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L
96ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // expected-error@-5 {{internal linkage}} expected-note@-10 {{here}}
97ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // expected-error@-4 {{internal linkage}} expected-note@-9 {{here}}
98ed7dc87192784841839908a88b6d0623f6278408Richard Smith#else
99ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // FIXME: Test this somehow.
100ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
101ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
102ed7dc87192784841839908a88b6d0623f6278408Richard Smith
103ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr113 { // dr113: yes
104ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern void (*p)();
105ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f() {
106ed7dc87192784841839908a88b6d0623f6278408Richard Smith    no_such_function(); // expected-error {{undeclared}}
107ed7dc87192784841839908a88b6d0623f6278408Richard Smith    p();
108ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
109ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g();
110ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void (*p)() = &g;
111ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
112ed7dc87192784841839908a88b6d0623f6278408Richard Smith
113ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr114 { // dr114: yes
114ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
115ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void f(int) = 0; // expected-note {{unimplemented}}
116ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
117ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : A {
118ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> void f(T);
119ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void g() { f(0); }
120ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } b; // expected-error {{abstract}}
121ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
122ed7dc87192784841839908a88b6d0623f6278408Richard Smith
123ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr115 { // dr115: yes
124ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> int f(T); // expected-note +{{}}
125ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> int g(T); // expected-note +{{}}
126ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> int g(T, int); // expected-note +{{}}
127ed7dc87192784841839908a88b6d0623f6278408Richard Smith
128ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k1 = f(&f); // expected-error {{no match}}
129ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k2 = f(&f<int>);
130ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k3 = f(&g<int>); // expected-error {{no match}}
131ed7dc87192784841839908a88b6d0623f6278408Richard Smith
132ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void h() {
133ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&f; // expected-error {{address of overloaded function 'f' cannot be cast to type 'void'}}
134ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&f<int>;
135ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&g<int>; // expected-error {{address of overloaded function 'g' cannot be cast to type 'void'}}
136ed7dc87192784841839908a88b6d0623f6278408Richard Smith
137ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &f; // expected-error {{reference to overloaded function could not be resolved}}
138ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &f<int>; // expected-warning {{unused}}
139ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &g<int>; // expected-error {{reference to overloaded function could not be resolved}}
140ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
141ed7dc87192784841839908a88b6d0623f6278408Richard Smith
142ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct S {
143ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> static int f(T);
144ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> static int g(T);
145ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> static int g(T, int);
146ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } s;
147ed7dc87192784841839908a88b6d0623f6278408Richard Smith
148ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k4 = f(&s.f); // expected-error {{non-constant pointer to member}}
149ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k5 = f(&s.f<int>);
150ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k6 = f(&s.g<int>); // expected-error {{non-constant pointer to member}}
151ed7dc87192784841839908a88b6d0623f6278408Richard Smith
152ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void i() {
153ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f; // expected-error {{non-constant pointer to member}}
154ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f<int>;
155ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.g<int>; // expected-error {{non-constant pointer to member}}
156ed7dc87192784841839908a88b6d0623f6278408Richard Smith
157ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f; // expected-error {{non-constant pointer to member}}
158ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f<int>; // expected-warning {{unused}}
159ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.g<int>; // expected-error {{non-constant pointer to member}}
160ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
161ed7dc87192784841839908a88b6d0623f6278408Richard Smith
162ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct T {
163ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> int f(T);
164ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> int g(T);
165ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> int g(T, int);
166ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } t;
167ed7dc87192784841839908a88b6d0623f6278408Richard Smith
168ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k7 = f(&s.f); // expected-error {{non-constant pointer to member}}
169ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k8 = f(&s.f<int>);
170ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k9 = f(&s.g<int>); // expected-error {{non-constant pointer to member}}
171ed7dc87192784841839908a88b6d0623f6278408Richard Smith
172ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void j() {
173ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f; // expected-error {{non-constant pointer to member}}
174ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f<int>;
175ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.g<int>; // expected-error {{non-constant pointer to member}}
176ed7dc87192784841839908a88b6d0623f6278408Richard Smith
177ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f; // expected-error {{non-constant pointer to member}}
178ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f<int>; // expected-warning {{unused}}
179ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.g<int>; // expected-error {{non-constant pointer to member}}
180ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
181ed7dc87192784841839908a88b6d0623f6278408Richard Smith
182ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L
183ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // Special case kicks in only if a template argument list is specified.
184ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T=int> void with_default(); // expected-note +{{}}
185ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k10 = f(&with_default); // expected-error {{no matching function}}
186ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k11 = f(&with_default<>);
187ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void k() {
188ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&with_default; // expected-error {{overloaded function}}
189ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&with_default<>;
190ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &with_default; // expected-error {{overloaded function}}
191ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &with_default<>; // expected-warning {{unused}}
192ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
193ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
194ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
195ed7dc87192784841839908a88b6d0623f6278408Richard Smith
196ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr116 { // dr116: yes
197ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<int> struct A {};
198ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<int N> void f(A<N>) {} // expected-note {{previous}}
199ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<int M> void f(A<M>) {} // expected-error {{redefinition}}
200ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> void f(A<sizeof(T)>) {} // expected-note {{previous}}
201ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename U> void f(A<sizeof(U)>) {} // expected-error {{redefinition}}
202ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
203ed7dc87192784841839908a88b6d0623f6278408Richard Smith
204ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr117: na
205ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr118 FIXME: add codegen test
206ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr119: na
207ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr120: na
208ed7dc87192784841839908a88b6d0623f6278408Richard Smith
209ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr121 { // dr121: yes
210ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct X {
211ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> struct Y {};
212ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
213ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct Z {
214ed7dc87192784841839908a88b6d0623f6278408Richard Smith    X::Y<T> x;
215ed7dc87192784841839908a88b6d0623f6278408Richard Smith    T::Y<T> y; // expected-error +{{}}
216ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
217ed7dc87192784841839908a88b6d0623f6278408Richard Smith  Z<X> z;
218ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
219ed7dc87192784841839908a88b6d0623f6278408Richard Smith
220ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr122 { // dr122: yes
221ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> void f();
222ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g() { f<int>(); }
223ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
224ed7dc87192784841839908a88b6d0623f6278408Richard Smith
225ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr123: na
226ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr124: dup 201
227ed7dc87192784841839908a88b6d0623f6278408Richard Smith
228ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr125: yes
229b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smithstruct dr125_A { struct dr125_B {}; }; // expected-note {{here}}
230ed7dc87192784841839908a88b6d0623f6278408Richard Smithdr125_A::dr125_B dr125_C();
231ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125_B { dr125_A dr125_C(); }
232ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125 {
233ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct X {
234ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend dr125_A::dr125_B (::dr125_C)(); // ok
235ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend dr125_A (::dr125_B::dr125_C)(); // ok
236b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith    friend dr125_A::dr125_B::dr125_C(); // expected-error {{did you mean the constructor name 'dr125_B'?}}
237a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    // expected-error@-1 {{missing exception specification}}
238b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith#if __cplusplus >= 201103L
239b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith    // expected-error@-3 {{follows constexpr declaration}} expected-note@-10 {{here}}
240b79b17b67f2c0de8fd343fdd070e5ccbfe20d602Richard Smith#endif
241ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
242ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
243ed7dc87192784841839908a88b6d0623f6278408Richard Smith
244ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr126 { // dr126: no
245ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct C {};
246ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct D : C {};
247ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct E : private C { friend class A; friend class B; };
248ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct F : protected C {};
249ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct G : C {};
250ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct H : D, G {};
251ed7dc87192784841839908a88b6d0623f6278408Richard Smith
252ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
253ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cp() throw(C*);
254ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dp() throw(C*);
255ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ep() throw(C*); // expected-note {{overridden}}
256ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fp() throw(C*); // expected-note {{overridden}}
257ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gp() throw(C*);
258ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hp() throw(C*); // expected-note {{overridden}}
259ed7dc87192784841839908a88b6d0623f6278408Richard Smith
260ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cr() throw(C&);
261ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dr() throw(C&);
262ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void er() throw(C&); // expected-note {{overridden}}
263ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fr() throw(C&); // expected-note {{overridden}}
264ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gr() throw(C&);
265ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hr() throw(C&); // expected-note {{overridden}}
266ed7dc87192784841839908a88b6d0623f6278408Richard Smith
267ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void pv() throw(void*); // expected-note {{overridden}}
268ed7dc87192784841839908a88b6d0623f6278408Richard Smith
269ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L
270ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void np() throw(C*); // expected-note {{overridden}}
271ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void npm() throw(int C::*); // expected-note {{overridden}}
272ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void nr() throw(C&); // expected-note {{overridden}}
273ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
274ed7dc87192784841839908a88b6d0623f6278408Richard Smith
275ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref1() throw(C *const&);
276ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref2() throw(C *);
277ed7dc87192784841839908a88b6d0623f6278408Richard Smith
278ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void v() throw(int);
279ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void w() throw(const int);
280ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void x() throw(int*);
281ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void y() throw(const int*);
282ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void z() throw(int); // expected-note {{overridden}}
283ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
284ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : A {
285ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cp() throw(C*);
286ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dp() throw(D*);
287ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ep() throw(E*); // expected-error {{more lax}}
288ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fp() throw(F*); // expected-error {{more lax}}
289ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gp() throw(G*);
290ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hp() throw(H*); // expected-error {{more lax}}
291ed7dc87192784841839908a88b6d0623f6278408Richard Smith
292ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cr() throw(C&);
293ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dr() throw(D&);
294ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void er() throw(E&); // expected-error {{more lax}}
295ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fr() throw(F&); // expected-error {{more lax}}
296ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gr() throw(G&);
297ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hr() throw(H&); // expected-error {{more lax}}
298ed7dc87192784841839908a88b6d0623f6278408Richard Smith
299ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void pv() throw(C*); // expected-error {{more lax}} FIXME: This is valid.
300ed7dc87192784841839908a88b6d0623f6278408Richard Smith
301ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L
302ed7dc87192784841839908a88b6d0623f6278408Richard Smith    using nullptr_t = decltype(nullptr);
303ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void np() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid.
304ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void npm() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid.
305ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void nr() throw(nullptr_t&); // expected-error {{more lax}} This is not.
306ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
307ed7dc87192784841839908a88b6d0623f6278408Richard Smith
308ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref1() throw(D *const &);
309ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref2() throw(D *);
310ed7dc87192784841839908a88b6d0623f6278408Richard Smith
311ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void v() throw(const int);
312ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void w() throw(int);
313ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void x() throw(const int*); // FIXME: 'const int*' is not allowed by A::h.
314ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void y() throw(int*); // ok
315ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void z() throw(long); // expected-error {{more lax}}
316ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
317ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
318ed7dc87192784841839908a88b6d0623f6278408Richard Smith
319ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr127 { // dr127: yes
3205c8a92ef245c773fa56e66a8c88ae9393eea2fb6Richard Smith  __extension__ typedef __decltype(sizeof(0)) size_t;
321ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct A {
322ed7dc87192784841839908a88b6d0623f6278408Richard Smith    A() throw(int);
323ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void *operator new(size_t, const char * = 0);
324ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void operator delete(void *, const char *) { T::error; } // expected-error 2{{no members}}
325ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void operator delete(void *) { T::error; }
326ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
327ed7dc87192784841839908a88b6d0623f6278408Richard Smith  A<void> *p = new A<void>; // expected-note {{instantiat}}
328ed7dc87192784841839908a88b6d0623f6278408Richard Smith  A<int> *q = new ("") A<int>; // expected-note {{instantiat}}
329ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
330ed7dc87192784841839908a88b6d0623f6278408Richard Smith
331ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr128 { // dr128: yes
332ed7dc87192784841839908a88b6d0623f6278408Richard Smith  enum E1 { e1 } x = e1;
333ed7dc87192784841839908a88b6d0623f6278408Richard Smith  enum E2 { e2 } y = static_cast<E2>(x), z = static_cast<E2>(e1);
334ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
335ed7dc87192784841839908a88b6d0623f6278408Richard Smith
336ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr129: dup 616
337ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr130: na
338ed7dc87192784841839908a88b6d0623f6278408Richard Smith
339ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr131 { // dr131: yes
340ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const char *a_with_\u0e8c = "\u0e8c";
341ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const char *b_with_\u0e8d = "\u0e8d";
342ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const char *c_with_\u0e8e = "\u0e8e";
343ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L
344ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // expected-error@-4 {{expected ';'}} expected-error@-2 {{expected ';'}}
345ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
346ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
347ed7dc87192784841839908a88b6d0623f6278408Richard Smith
348ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr132 { // dr132: no
349ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f() {
350ed7dc87192784841839908a88b6d0623f6278408Richard Smith    extern struct {} x; // ok
351ed7dc87192784841839908a88b6d0623f6278408Richard Smith    extern struct S {} y; // FIXME: This is invalid.
352ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
353ed7dc87192784841839908a88b6d0623f6278408Richard Smith  static enum { E } e;
354ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
355ed7dc87192784841839908a88b6d0623f6278408Richard Smith
356ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr133: dup 87
357ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr134: na
358ed7dc87192784841839908a88b6d0623f6278408Richard Smith
359ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr135 { // dr135: yes
360ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
361ed7dc87192784841839908a88b6d0623f6278408Richard Smith    A f(A a) { return a; }
362ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend A g(A a) { return a; }
363ed7dc87192784841839908a88b6d0623f6278408Richard Smith    static A h(A a) { return a; }
364ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
365ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
366ed7dc87192784841839908a88b6d0623f6278408Richard Smith
367f6a144f5991c6b29622a31fdab86adede0648d12David Majnemernamespace dr136 { // dr136: 3.4
368f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  void f(int, int, int = 0); // expected-note {{previous declaration is here}}
369f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  void g(int, int, int); // expected-note {{previous declaration is here}}
370ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
371f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void f(int, int = 0, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
372f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void g(int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
373f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void h(int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be a definition}}
374f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void i(int, int, int = 0) {} // expected-note {{previous declaration is here}}
375ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend void j(int, int, int = 0) {}
376ed7dc87192784841839908a88b6d0623f6278408Richard Smith    operator int();
377ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
378f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  void i(int, int, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
379ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void q() {
380ed7dc87192784841839908a88b6d0623f6278408Richard Smith    j(A(), A()); // ok, has default argument
381ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
382f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  extern "C" void k(int, int, int, int); // expected-note {{previous declaration is here}}
383f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  namespace NSA {
384f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct A {
385f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void dr136::k(int, int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}} \
386f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer                                                  // expected-note {{previous declaration is here}}
387f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
388f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  }
389f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  namespace NSB {
390f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct A {
391f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void dr136::k(int, int, int = 0, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
392f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
393f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  }
394f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct B {
395f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    void f(int); // expected-note {{previous declaration is here}}
396f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
397f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct C {
398f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void B::f(int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
399f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
400ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
401ed7dc87192784841839908a88b6d0623f6278408Richard Smith
402ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr137 { // dr137: yes
403ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern void *p;
404ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern const void *cp;
405ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern volatile void *vp;
406ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern const volatile void *cvp;
407ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *q = static_cast<int*>(p);
408ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *qc = static_cast<int*>(cp); // expected-error {{casts away qualifiers}}
409ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *qv = static_cast<int*>(vp); // expected-error {{casts away qualifiers}}
410ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *qcv = static_cast<int*>(cvp); // expected-error {{casts away qualifiers}}
411ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cq = static_cast<const int*>(p);
412ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cqc = static_cast<const int*>(cp);
413ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cqv = static_cast<const int*>(vp); // expected-error {{casts away qualifiers}}
414ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cqcv = static_cast<const int*>(cvp); // expected-error {{casts away qualifiers}}
415ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvq = static_cast<const volatile int*>(p);
416ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvqc = static_cast<const volatile int*>(cp);
417ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvqv = static_cast<const volatile int*>(vp);
418ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvqcv = static_cast<const volatile int*>(cvp);
419ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
420ed7dc87192784841839908a88b6d0623f6278408Richard Smith
421ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr139 { // dr139: yes
422ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example1 {
423ed7dc87192784841839908a88b6d0623f6278408Richard Smith    typedef int f; // expected-note {{previous}}
424ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct A {
425ed7dc87192784841839908a88b6d0623f6278408Richard Smith      friend void f(A &); // expected-error {{different kind of symbol}}
426ed7dc87192784841839908a88b6d0623f6278408Richard Smith    };
427ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
428ed7dc87192784841839908a88b6d0623f6278408Richard Smith
429ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example2 {
430ed7dc87192784841839908a88b6d0623f6278408Richard Smith    typedef int f;
431ed7dc87192784841839908a88b6d0623f6278408Richard Smith    namespace N {
432ed7dc87192784841839908a88b6d0623f6278408Richard Smith      struct A {
433ed7dc87192784841839908a88b6d0623f6278408Richard Smith        friend void f(A &);
434ed7dc87192784841839908a88b6d0623f6278408Richard Smith        operator int();
435ed7dc87192784841839908a88b6d0623f6278408Richard Smith        void g(A a) { int i = f(a); } // ok, f is typedef not friend function
436ed7dc87192784841839908a88b6d0623f6278408Richard Smith      };
437ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
438ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
439ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
440ed7dc87192784841839908a88b6d0623f6278408Richard Smith
441ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr140 { // dr140: yes
442ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f(int *const) {} // expected-note {{previous}}
443ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f(int[3]) {} // expected-error {{redefinition}}
444ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g(const int);
445ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g(int n) { n = 2; }
446ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
447ed7dc87192784841839908a88b6d0623f6278408Richard Smith
448ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr141 { // dr141: yes
449ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> void f();
450ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct S { int n; };
451ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A : S<int> {
452ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> void f();
453ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> struct S {};
454ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } a;
455ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : S<int> {} b;
456ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g() {
457ed7dc87192784841839908a88b6d0623f6278408Richard Smith    a.f<int>();
458ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)a.S<int>::n; // expected-error {{no member named 'n'}}
459ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L
460ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // expected-error@-2 {{ambiguous}}
461ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // expected-note@-11 {{lookup from the current scope}}
462ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // expected-note@-9 {{lookup in the object type}}
463ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
464ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b.f<int>(); // expected-error {{no member}} expected-error +{{}}
465ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)b.S<int>::n;
466ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
467ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct C {
468ed7dc87192784841839908a88b6d0623f6278408Richard Smith    T t;
469ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void g() {
470ed7dc87192784841839908a88b6d0623f6278408Richard Smith      t.f<int>(); // expected-error {{use 'template'}}
471ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
472ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void h() {
473ed7dc87192784841839908a88b6d0623f6278408Richard Smith      (void)t.S<int>::n; // ok
474ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
475ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void i() {
476ed7dc87192784841839908a88b6d0623f6278408Richard Smith      (void)t.S<int>(); // ok!
477ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
478ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
479ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void h() { C<B>().h(); } // ok
480ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct X {
481ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> void S();
482ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
483ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void i() { C<X>().i(); } // ok!!
484ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
485ed7dc87192784841839908a88b6d0623f6278408Richard Smith
486ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr142 { // dr142: yes
487ed7dc87192784841839908a88b6d0623f6278408Richard Smith  class B { // expected-note +{{here}}
488ed7dc87192784841839908a88b6d0623f6278408Richard Smith  public:
489ed7dc87192784841839908a88b6d0623f6278408Richard Smith    int mi; // expected-note +{{here}}
490ed7dc87192784841839908a88b6d0623f6278408Richard Smith    static int si; // expected-note +{{here}}
491ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
492ed7dc87192784841839908a88b6d0623f6278408Richard Smith  class D : private B { // expected-note +{{here}}
493ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
494ed7dc87192784841839908a88b6d0623f6278408Richard Smith  class DD : public D {
495ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void f();
496ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
497ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void DD::f() {
498ed7dc87192784841839908a88b6d0623f6278408Richard Smith    mi = 3; // expected-error {{private base class}} expected-error {{private member}}
499ed7dc87192784841839908a88b6d0623f6278408Richard Smith    si = 3; // expected-error {{private member}}
500ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B b_old; // expected-error {{private member}}
501ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B b;
502ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b.mi = 3;
503ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b.si = 3;
504ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B::si = 3; // expected-error {{private member}}
505ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B::si = 3;
506ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B *bp1_old = this; // expected-error {{private member}} expected-error {{private base class}}
507ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B *bp1 = this; // expected-error {{private base class}}
508ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B *bp2_old = (B*)this; // expected-error 2{{private member}}
509ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B *bp2 = (dr142::B*)this;
510ed7dc87192784841839908a88b6d0623f6278408Richard Smith    bp2->mi = 3;
511ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
512ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
513ed7dc87192784841839908a88b6d0623f6278408Richard Smith
514ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr143 { // dr143: yes
515ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace A { struct X; }
516ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace B { void f(A::X); }
517ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace A {
518ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct X { friend void B::f(X); };
519ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
520ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g(A::X x) {
521ed7dc87192784841839908a88b6d0623f6278408Richard Smith    f(x); // expected-error {{undeclared identifier 'f'}}
522ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
523ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
524ed7dc87192784841839908a88b6d0623f6278408Richard Smith
525ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr145 { // dr145: yes
526ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f(bool b) {
527a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#if __cplusplus <= 201402L
528ed7dc87192784841839908a88b6d0623f6278408Richard Smith    ++b; // expected-warning {{deprecated}}
529ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b++; // expected-warning {{deprecated}}
530a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#else
531a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    ++b; // expected-error {{increment}}
532a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    b++; // expected-error {{increment}}
533a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar#endif
534ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
535ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
536ed7dc87192784841839908a88b6d0623f6278408Richard Smith
537ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr147 { // dr147: no
538ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example1 {
539ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename> struct A {
540ed7dc87192784841839908a88b6d0623f6278408Richard Smith      template<typename T> A(T);
541ed7dc87192784841839908a88b6d0623f6278408Richard Smith    };
542ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // FIXME: This appears to be valid, and EDG and G++ accept.
543ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<> template<> A<int>::A<int>(int) {} // expected-error {{out-of-line constructor for 'A' cannot have template arguments}}
544ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
545ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example2 {
546ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct A { A(); };
547ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct B : A { B(); };
548ed7dc87192784841839908a88b6d0623f6278408Richard Smith    A::A a1; // expected-error {{is a constructor}}
549ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B::A a2;
550ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
551ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example3 {
552ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename> struct A {
553ed7dc87192784841839908a88b6d0623f6278408Richard Smith      template<typename T> A(T);
554ed7dc87192784841839908a88b6d0623f6278408Richard Smith      static A a;
555ed7dc87192784841839908a88b6d0623f6278408Richard Smith    };
556ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<> A<int>::A<int>(A<int>::a); // expected-error {{is a constructor}}
557ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
558ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
559ed7dc87192784841839908a88b6d0623f6278408Richard Smith
560ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr148 { // dr148: yes
561ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A { int A::*p; };
562ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int check1[__is_pod(int(A::*)) ? 1 : -1];
563ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int check2[__is_pod(A) ? 1 : -1];
564ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
565ed7dc87192784841839908a88b6d0623f6278408Richard Smith
566ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr149: na
567cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
568cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr151 { // dr151: yes
569cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct X {};
570cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  typedef int X::*p;
571cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#if __cplusplus < 201103L
572cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#define fold(x) (__builtin_constant_p(0) ? (x) : (x))
573cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#else
574cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#define fold
575cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#endif
576cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  int check[fold(p() == 0) ? 1 : -1];
577cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith#undef fold
578cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
579cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
580cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr152 { // dr152: yes
581cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct A {
582cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    A(); // expected-note {{not viable}}
583cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    explicit A(const A&);
584cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  };
585cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  A a1 = A(); // expected-error {{no matching constructor}}
586cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  A a2((A()));
587cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
588cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
589cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith// dr153: na
590cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
591cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr154 { // dr154: yes
592cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  union { int a; }; // expected-error {{must be declared 'static'}}
593cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  namespace {
594cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    union { int b; };
595cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  }
596cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  static union { int c; };
597cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
598cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
599cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr155 { // dr155: dup 632
600cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct S { int n; } s = { { 1 } }; // expected-warning {{braces around scalar initializer}}
601cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
602cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dr158 FIXME write codegen test
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace dr159 { // dr159: 3.5
606cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  namespace X { void f(); }
607cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  void f();
608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dr159::f() {} // expected-warning {{extra qualification}}
609cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  void dr159::X::f() {}
610cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
611cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
612cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith// dr160: na
613cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
614cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr161 { // dr161: yes
615cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  class A {
616cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  protected:
617cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    struct B { int n; } b; // expected-note 2{{here}}
618cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    static B bs;
619cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    void f(); // expected-note {{here}}
620cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    static void sf();
621cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  };
622cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct C : A {};
623cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct D : A {
624cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    void g(C c) {
625cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      (void)b.n;
626cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      B b1;
627cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      C::B b2; // ok, accessible as a member of A
628cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      (void)&C::b; // expected-error {{protected}}
629cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      (void)&C::bs;
630cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      (void)c.b; // expected-error {{protected}}
631cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      (void)c.bs;
632cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      f();
633cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      sf();
634cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      c.f(); // expected-error {{protected}}
635cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      c.sf();
636cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      A::f();
637cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      D::f();
638cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      A::sf();
639cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      C::sf();
640cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      D::sf();
641cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    }
642cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  };
643cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
644cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
645cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr162 { // dr162: no
646cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct A {
647cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    char &f(char);
648cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    static int &f(int);
649cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
650cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    void g() {
651cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      int &a = (&A::f)(0); // FIXME: expected-error {{could not be resolved}}
652cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith      char &b = (&A::f)('0'); // expected-error {{could not be resolved}}
653cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    }
654cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  };
655cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
656cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  int &c = (&A::f)(0); // FIXME: expected-error {{could not be resolved}}
657cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  char &d = (&A::f)('0'); // expected-error {{could not be resolved}}
658cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
659cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
660cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith// dr163: na
661cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
662cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr164 { // dr164: yes
663cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  void f(int);
664cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  template <class T> int g(T t) { return f(t); }
665cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
666cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  enum E { e };
667cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  int f(E);
668cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
669cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  int k = g(e);
670cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
671cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith
672cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smithnamespace dr165 { // dr165: no
673cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  namespace N {
674cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    struct A { friend struct B; };
675cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith    void f() { void g(); }
676cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  }
677cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  // FIXME: dr1477 says this is ok, dr165 says it's ill-formed
678cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  struct N::B {};
679cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  // FIXME: dr165 says this is ill-formed, but the argument in dr1477 says it's ok
680cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith  void N::g() {}
681cb82c8975fccdd0ae97c70c24e860d1383d81fd0Richard Smith}
682fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
683fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smithnamespace dr166 { // dr166: yes
684fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  namespace A { class X; }
685fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
686fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  template<typename T> int f(T t) { return t.n; }
687fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  int g(A::X);
688fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  template<typename T> int h(T t) { return t.n; } // expected-error {{private}}
689fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  int i(A::X);
690fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
691fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  namespace A {
692fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    class X {
693fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith      friend int f<X>(X);
694fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith      friend int dr166::g(X);
695fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith      friend int h(X);
696fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith      friend int i(X);
697fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith      int n; // expected-note 2{{here}}
698fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    };
699fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
700fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    int h(X x) { return x.n; }
701fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    int i(X x) { return x.n; }
702fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  }
703fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
704fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  template int f(A::X);
705fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  int g(A::X x) { return x.n; }
706fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  template int h(A::X); // expected-note {{instantiation}}
707fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  int i(A::X x) { return x.n; } // expected-error {{private}}
708fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith}
709fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
710fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith// dr167: sup 1012
711fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
712fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smithnamespace dr168 { // dr168: no
713fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  extern "C" typedef int (*p)();
714fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  extern "C++" typedef int (*q)();
715fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  struct S {
716fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    static int f();
717fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  };
718fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  p a = &S::f; // FIXME: this should fail.
719fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  q b = &S::f;
720fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith}
721fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith
722fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smithnamespace dr169 { // dr169: yes
723fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  template<typename> struct A { int n; };
724fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  struct B {
725fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    template<typename> struct C;
726fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    template<typename> void f();
727fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    template<typename> static int n; // expected-error 0-1{{extension}}
728fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  };
729fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  struct D : A<int>, B {
730fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith    using A<int>::n;
731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using B::C<int>; // expected-error {{using declaration cannot refer to a template specialization}}
732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using B::f<int>; // expected-error {{using declaration cannot refer to a template specialization}}
733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    using B::n<int>; // expected-error {{using declaration cannot refer to a template specialization}}
734fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith  };
735fed2603a98c8898cff5dec4b935a00bb9f4d8eccRichard Smith}
736e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
737e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace { // dr171: yes
738e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int dr171a;
739e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
740e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithint dr171b; // expected-note {{here}}
741e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr171 {
742e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  extern "C" void dr171a();
743e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  extern "C" void dr171b(); // expected-error {{conflicts}}
744e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
745e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
746e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr172 { // dr172: yes
747e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { zero };
748e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check1[-1 < zero ? 1 : -1];
749e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
750e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { x = -1, y = (unsigned int)-1 };
751e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check2[sizeof(x) > sizeof(int) ? 1 : -1];
752e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
753e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { a = (unsigned int)-1 / 2 };
754e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check3a[sizeof(a) == sizeof(int) ? 1 : -1];
755e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check3b[-a < 0 ? 1 : -1];
756e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
757e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { b = (unsigned int)-1 / 2 + 1 };
758e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check4a[sizeof(b) == sizeof(unsigned int) ? 1 : -1];
759e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check4b[-b > 0 ? 1 : -1];
760e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
761e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { c = (unsigned long)-1 / 2 };
762e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check5a[sizeof(c) == sizeof(long) ? 1 : -1];
763e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check5b[-c < 0 ? 1 : -1];
764e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
765e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { d = (unsigned long)-1 / 2 + 1 };
766e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check6a[sizeof(d) == sizeof(unsigned long) ? 1 : -1];
767e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check6b[-d > 0 ? 1 : -1];
768e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
769e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { e = (unsigned long long)-1 / 2 }; // expected-error 0-1{{extension}}
770e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check7a[sizeof(e) == sizeof(long) ? 1 : -1]; // expected-error 0-1{{extension}}
771e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check7b[-e < 0 ? 1 : -1];
772e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
773e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum { f = (unsigned long long)-1 / 2 + 1 }; // expected-error 0-1{{extension}}
774e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check8a[sizeof(f) == sizeof(unsigned long) ? 1 : -1]; // expected-error 0-1{{extension}}
775e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check8b[-f > 0 ? 1 : -1];
776e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
777e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
778e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr173 { // dr173: yes
779e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check[('0' + 1 == '1' && '0' + 2 == '2' && '0' + 3 == '3' &&
780e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith             '0' + 4 == '4' && '0' + 5 == '5' && '0' + 6 == '6' &&
781e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith             '0' + 7 == '7' && '0' + 8 == '8' && '0' + 9 == '9') ? 1 : -1];
782e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
783e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
784e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr174: sup 1012
785e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
786e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr175 { // dr175: yes
787e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct A {}; // expected-note {{here}}
788e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct B : private A {}; // expected-note {{constrained by private inheritance}}
789e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct C : B {
790e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    A a; // expected-error {{private}}
791e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    dr175::A b;
792e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
793e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
794e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
795e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr176 { // dr176: yes
796e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> class Y;
797e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<> class Y<int> {
798e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void f() {
799e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      typedef Y A; // expected-note {{here}}
800e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      typedef Y<char> A; // expected-error {{different types ('Y<char>' vs 'Y<int>')}}
801e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    }
802e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
803e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
804e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> struct Base {}; // expected-note 2{{found}}
805e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> struct Derived : public Base<T> {
806e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void f() {
807e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      typedef typename Derived::template Base<T> A;
808e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      typedef typename Derived::Base A;
809e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    }
810e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
811e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template struct Derived<int>;
812e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
813e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> struct Derived2 : Base<int>, Base<char> {
814e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    typename Derived2::Base b; // expected-error {{found in multiple base classes}}
815e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    typename Derived2::Base<double> d;
816e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
817e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
818e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> class X { // expected-note {{here}}
819e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    X *p1;
820e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    X<T> *p2;
821e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    X<int> *p3;
822e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    dr176::X *p4; // expected-error {{requires template arguments}}
823e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
824e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
825e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
826e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr177 { // dr177: yes
827e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct B {};
828e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct A {
829e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    A(A &); // expected-note {{not viable: expects an l-value}}
830e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    A(const B &);
831e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
832e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  B b;
833e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  A a = b; // expected-error {{no viable constructor copying variable}}
834e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
835e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
836e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr178 { // dr178: yes
837e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check[int() == 0 ? 1 : -1];
838e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus >= 201103L
839e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  static_assert(int{} == 0, "");
840e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct S { int a, b; };
841e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  static_assert(S{1}.b == 0, "");
842e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct T { constexpr T() : n() {} int n; };
843e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  static_assert(T().n == 0, "");
844e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct U : S { constexpr U() : S() {} };
845e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  static_assert(U().b == 0, "");
846e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif
847e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
848e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
849e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr179 { // dr179: yes
850e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void f();
851e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int n = &f - &f; // expected-error {{arithmetic on pointers to the function type 'void ()'}}
852e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
853e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
854e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr180 { // dr180: yes
855e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> struct X : T, T::some_base {
856e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    X() : T::some_type_that_might_be_T(), T::some_base() {}
857e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    friend class T::some_class;
858e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void f() {
859e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      enum T::some_enum e;
860e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    }
861e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
862e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
863e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
864e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr181 { // dr181: yes
865e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  namespace X {
866e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    template <template X<class T> > struct A { }; // expected-error +{{}}
867e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    template <template X<class T> > void f(A<X>) { } // expected-error +{{}}
868e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
869e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
870e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  namespace Y {
871e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    template <template <class T> class X> struct A { };
872e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    template <template <class T> class X> void f(A<X>) { }
873e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
874e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
875e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
876e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr182 { // dr182: yes
877e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template <class T> struct C {
878e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void f();
879e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void g();
880e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
881e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
882e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template <class T> void C<T>::f() {}
883e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template <class T> void C<T>::g() {}
884e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
885e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  class A {
886e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    class B {}; // expected-note {{here}}
887e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void f();
888e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
889e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
890e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template void C<A::B>::f();
891e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template <> void C<A::B>::g(); // expected-error {{private}}
892e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
893e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void A::f() {
894e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    C<B> cb;
895e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    cb.f();
896e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
897e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
898e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
899e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr183 { // dr183: sup 382
900e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> struct A {};
901e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T> struct B {
902e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    typedef int X;
903e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
904e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<> struct A<int> {
905e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    typename B<int>::X x;
906e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
907e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
908e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
909e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr184 { // dr184: yes
910e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<typename T = float> struct B {};
911e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
912e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<template<typename TT = float> class T> struct A {
913e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void f();
914e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    void g();
915e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
916e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
917e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<template<typename TT> class T> void A<T>::f() { // expected-note {{here}}
918e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    T<> t; // expected-error {{too few template arguments}}
919e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
920e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
921e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<template<typename TT = char> class T> void A<T>::g() {
922e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    T<> t;
923e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    typedef T<> X;
924e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    typedef T<char> X;
925e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
926e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
927e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void h() { A<B>().g(); }
928e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
929e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
930e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr185 FIXME: add codegen test
931e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
932e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr187 { // dr187: sup 481
933e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  const int Z = 1;
934e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template<int X = Z, int Z = X> struct A;
935e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  typedef A<> T;
936e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  typedef A<1, 1> T;
937e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
938e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
939e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr188 { // dr188: yes
940e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  char c[10];
941e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int check[sizeof(0, c) == 10 ? 1 : -1];
942e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
943e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
944e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr190 FIXME: add codegen test for tbaa
945e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
946e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr193 FIXME: add codegen test
947e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
948e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr194 { // dr194: yes
949e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct A {
950e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    A();
951a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    void A(); // expected-error {{constructor cannot have a return type}}
952e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
953e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct B {
954a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    void B(); // expected-error {{constructor cannot have a return type}}
955e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    B();
956e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
957e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct C {
958e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    inline explicit C(int) {}
959e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
960e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
961e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
962e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr195 { // dr195: yes
963e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void f();
964e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int *p = (int*)&f; // expected-error 0-1{{extension}}
965e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void (*q)() = (void(*)())&p; // expected-error 0-1{{extension}}
966e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
967e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
968e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr197 { // dr197: yes
969e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  char &f(char);
970e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
971e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  template <class T> void g(T t) {
972e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    char &a = f(1);
973e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    char &b = f(T(1)); // expected-error {{unrelated type 'int'}}
974e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    char &c = f(t); // expected-error {{unrelated type 'int'}}
975e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
976e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
977e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void f(int);
978e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
979e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  enum E { e };
980e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  int &f(E);
981e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
982e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  void h() {
983e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    g('a');
984e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    g(2);
985e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    g(e); // expected-note {{in instantiation of}}
986e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  }
987e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
988e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
989e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smithnamespace dr198 { // dr198: yes
990e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct A {
991e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    int n;
992e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    struct B {
993e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      int m[sizeof(n)];
994e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus < 201103L
995e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      // expected-error@-2 {{invalid use of non-static data member}}
996e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif
997e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      int f() { return n; }
998e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith      // expected-error@-1 {{use of non-static data member 'n' of 'A' from nested type 'B'}}
999e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    };
1000e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    struct C;
1001e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    struct D;
1002e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
1003e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct A::C {
1004e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    int m[sizeof(n)];
1005e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus < 201103L
1006e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    // expected-error@-2 {{invalid use of non-static data member}}
1007e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif
1008e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    int f() { return n; }
1009e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    // expected-error@-1 {{use of non-static data member 'n' of 'A' from nested type 'C'}}
1010e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
1011e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  struct A::D : A {
1012e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    int m[sizeof(n)];
1013e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#if __cplusplus < 201103L
1014e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    // expected-error@-2 {{invalid use of non-static data member}}
1015e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith#endif
1016e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith    int f() { return n; }
1017e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith  };
1018e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith}
1019e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith
1020e9a5b3871f3d58fa226910fd8123c98fc8bc6c67Richard Smith// dr199 FIXME: add codegen test
1021