1ed7dc87192784841839908a88b6d0623f6278408Richard Smith// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
2ed7dc87192784841839908a88b6d0623f6278408Richard Smith// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
3ed7dc87192784841839908a88b6d0623f6278408Richard Smith// RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
4ed7dc87192784841839908a88b6d0623f6278408Richard Smith
5ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr100 { // dr100: yes
6ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<const char *> struct A {}; // expected-note {{declared here}}
7ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<const char (&)[4]> struct B {}; // expected-note {{declared here}}
8ed7dc87192784841839908a88b6d0623f6278408Richard Smith  A<"foo"> a; // expected-error {{does not refer to any declaration}}
9ed7dc87192784841839908a88b6d0623f6278408Richard Smith  B<"bar"> b; // expected-error {{does not refer to any declaration}}
10ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
11ed7dc87192784841839908a88b6d0623f6278408Richard Smith
12662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smithnamespace dr101 { // dr101: yes
13662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  extern "C" void dr101_f();
14ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef unsigned size_t;
15ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace X {
16662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith    extern "C" void dr101_f();
17ed7dc87192784841839908a88b6d0623f6278408Richard Smith    typedef unsigned size_t;
18ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
19662f41bd9d4bfb4aebaba05e6043a6ff5f0dc2ffRichard Smith  using X::dr101_f;
20ed7dc87192784841839908a88b6d0623f6278408Richard Smith  using X::size_t;
21ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
22ed7dc87192784841839908a88b6d0623f6278408Richard Smith
23ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr102 { // dr102: yes
24ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace A {
25ed7dc87192784841839908a88b6d0623f6278408Richard 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}}
26ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
27ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace B {
28ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct S {};
29ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
30ed7dc87192784841839908a88b6d0623f6278408Richard Smith  B::S operator+(B::S, B::S); // expected-note {{should be declared prior to the call site or in namespace 'dr102::B'}}
31ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template B::S A::f(B::S, B::S); // expected-note {{in instantiation of}}
32ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
33ed7dc87192784841839908a88b6d0623f6278408Richard Smith
34ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr103: na
35ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr104 FIXME: add codegen test
36ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr105: na
37ed7dc87192784841839908a88b6d0623f6278408Richard Smith
38ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr106 { // dr106: sup 540
39ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef int &r1;
40ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef r1 &r1;
41ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef const r1 r1;
42ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef const r1 &r1;
43ed7dc87192784841839908a88b6d0623f6278408Richard Smith
44ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef const int &r2;
45ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef r2 &r2;
46ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef const r2 r2;
47ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef const r2 &r2;
48ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
49ed7dc87192784841839908a88b6d0623f6278408Richard Smith
50ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr107 { // dr107: yes
51ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct S {};
52ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern "C" S operator+(S, S) { return S(); }
53ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
54ed7dc87192784841839908a88b6d0623f6278408Richard Smith
55ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr108 { // dr108: yes
56ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct A {
57ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct B { typedef int X; };
58ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B::X x; // expected-error {{missing 'typename'}}
59ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct C : B { X x; }; // expected-error {{unknown type name}}
60ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
61ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<> struct A<int>::B { int X; };
62ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
63ed7dc87192784841839908a88b6d0623f6278408Richard Smith
64ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr109 { // dr109: yes
65ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A { template<typename T> void f(T); };
66ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct B : T {
67ed7dc87192784841839908a88b6d0623f6278408Richard Smith    using T::template f; // expected-error {{using declaration can not refer to a template}}
68ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void g() { this->f<int>(123); } // expected-error {{use 'template'}}
69ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
70ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
71ed7dc87192784841839908a88b6d0623f6278408Richard Smith
72ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr111 { // dr111: dup 535
73ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A { A(); A(volatile A&, int = 0); A(A&, const char * = "foo"); };
74ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : A { B(); }; // expected-note {{would lose const qualifier}} expected-note {{requires 0 arguments}}
75ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const B b1;
76ed7dc87192784841839908a88b6d0623f6278408Richard Smith  B b2(b1); // expected-error {{no matching constructor}}
77ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
78ed7dc87192784841839908a88b6d0623f6278408Richard Smith
79ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr112 { // dr112: yes
80ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct T { int n; };
81ed7dc87192784841839908a88b6d0623f6278408Richard Smith  typedef T Arr[1];
82ed7dc87192784841839908a88b6d0623f6278408Richard Smith
83ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const T a1[1] = {};
84ed7dc87192784841839908a88b6d0623f6278408Richard Smith  volatile T a2[1] = {};
85ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const Arr a3 = {};
86ed7dc87192784841839908a88b6d0623f6278408Richard Smith  volatile Arr a4 = {};
87ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<const volatile T*> struct X {};
88ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a1> x1;
89ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a2> x2;
90ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a3> x3;
91ed7dc87192784841839908a88b6d0623f6278408Richard Smith  X<a4> x4;
92ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L
93ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // expected-error@-5 {{internal linkage}} expected-note@-10 {{here}}
94ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // expected-error@-4 {{internal linkage}} expected-note@-9 {{here}}
95ed7dc87192784841839908a88b6d0623f6278408Richard Smith#else
96ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // FIXME: Test this somehow.
97ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
98ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
99ed7dc87192784841839908a88b6d0623f6278408Richard Smith
100ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr113 { // dr113: yes
101ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern void (*p)();
102ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f() {
103ed7dc87192784841839908a88b6d0623f6278408Richard Smith    no_such_function(); // expected-error {{undeclared}}
104ed7dc87192784841839908a88b6d0623f6278408Richard Smith    p();
105ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
106ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g();
107ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void (*p)() = &g;
108ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
109ed7dc87192784841839908a88b6d0623f6278408Richard Smith
110ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr114 { // dr114: yes
111ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
112ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void f(int) = 0; // expected-note {{unimplemented}}
113ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
114ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : A {
115ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> void f(T);
116ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void g() { f(0); }
117ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } b; // expected-error {{abstract}}
118ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
119ed7dc87192784841839908a88b6d0623f6278408Richard Smith
120ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr115 { // dr115: yes
121ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> int f(T); // expected-note +{{}}
122ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> int g(T); // expected-note +{{}}
123ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> int g(T, int); // expected-note +{{}}
124ed7dc87192784841839908a88b6d0623f6278408Richard Smith
125ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k1 = f(&f); // expected-error {{no match}}
126ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k2 = f(&f<int>);
127ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k3 = f(&g<int>); // expected-error {{no match}}
128ed7dc87192784841839908a88b6d0623f6278408Richard Smith
129ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void h() {
130ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&f; // expected-error {{address of overloaded function 'f' cannot be cast to type 'void'}}
131ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&f<int>;
132ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&g<int>; // expected-error {{address of overloaded function 'g' cannot be cast to type 'void'}}
133ed7dc87192784841839908a88b6d0623f6278408Richard Smith
134ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &f; // expected-error {{reference to overloaded function could not be resolved}}
135ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &f<int>; // expected-warning {{unused}}
136ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &g<int>; // expected-error {{reference to overloaded function could not be resolved}}
137ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
138ed7dc87192784841839908a88b6d0623f6278408Richard Smith
139ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct S {
140ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> static int f(T);
141ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> static int g(T);
142ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> static int g(T, int);
143ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } s;
144ed7dc87192784841839908a88b6d0623f6278408Richard Smith
145ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k4 = f(&s.f); // expected-error {{non-constant pointer to member}}
146ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k5 = f(&s.f<int>);
147ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k6 = f(&s.g<int>); // expected-error {{non-constant pointer to member}}
148ed7dc87192784841839908a88b6d0623f6278408Richard Smith
149ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void i() {
150ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f; // expected-error {{non-constant pointer to member}}
151ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f<int>;
152ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.g<int>; // expected-error {{non-constant pointer to member}}
153ed7dc87192784841839908a88b6d0623f6278408Richard Smith
154ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f; // expected-error {{non-constant pointer to member}}
155ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f<int>; // expected-warning {{unused}}
156ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.g<int>; // expected-error {{non-constant pointer to member}}
157ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
158ed7dc87192784841839908a88b6d0623f6278408Richard Smith
159ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct T {
160ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> int f(T);
161ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> int g(T);
162ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> int g(T, int);
163ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } t;
164ed7dc87192784841839908a88b6d0623f6278408Richard Smith
165ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k7 = f(&s.f); // expected-error {{non-constant pointer to member}}
166ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k8 = f(&s.f<int>);
167ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k9 = f(&s.g<int>); // expected-error {{non-constant pointer to member}}
168ed7dc87192784841839908a88b6d0623f6278408Richard Smith
169ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void j() {
170ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f; // expected-error {{non-constant pointer to member}}
171ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.f<int>;
172ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&s.g<int>; // expected-error {{non-constant pointer to member}}
173ed7dc87192784841839908a88b6d0623f6278408Richard Smith
174ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f; // expected-error {{non-constant pointer to member}}
175ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.f<int>; // expected-warning {{unused}}
176ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &s.g<int>; // expected-error {{non-constant pointer to member}}
177ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
178ed7dc87192784841839908a88b6d0623f6278408Richard Smith
179ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L
180ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // Special case kicks in only if a template argument list is specified.
181ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T=int> void with_default(); // expected-note +{{}}
182ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k10 = f(&with_default); // expected-error {{no matching function}}
183ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int k11 = f(&with_default<>);
184ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void k() {
185ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&with_default; // expected-error {{overloaded function}}
186ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)&with_default<>;
187ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &with_default; // expected-error {{overloaded function}}
188ed7dc87192784841839908a88b6d0623f6278408Richard Smith    &with_default<>; // expected-warning {{unused}}
189ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
190ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
191ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
192ed7dc87192784841839908a88b6d0623f6278408Richard Smith
193ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr116 { // dr116: yes
194ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<int> struct A {};
195ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<int N> void f(A<N>) {} // expected-note {{previous}}
196ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<int M> void f(A<M>) {} // expected-error {{redefinition}}
197ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> void f(A<sizeof(T)>) {} // expected-note {{previous}}
198ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename U> void f(A<sizeof(U)>) {} // expected-error {{redefinition}}
199ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
200ed7dc87192784841839908a88b6d0623f6278408Richard Smith
201ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr117: na
202ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr118 FIXME: add codegen test
203ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr119: na
204ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr120: na
205ed7dc87192784841839908a88b6d0623f6278408Richard Smith
206ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr121 { // dr121: yes
207ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct X {
208ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> struct Y {};
209ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
210ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct Z {
211ed7dc87192784841839908a88b6d0623f6278408Richard Smith    X::Y<T> x;
212ed7dc87192784841839908a88b6d0623f6278408Richard Smith    T::Y<T> y; // expected-error +{{}}
213ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
214ed7dc87192784841839908a88b6d0623f6278408Richard Smith  Z<X> z;
215ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
216ed7dc87192784841839908a88b6d0623f6278408Richard Smith
217ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr122 { // dr122: yes
218ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> void f();
219ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g() { f<int>(); }
220ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
221ed7dc87192784841839908a88b6d0623f6278408Richard Smith
222ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr123: na
223ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr124: dup 201
224ed7dc87192784841839908a88b6d0623f6278408Richard Smith
225ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr125: yes
226ed7dc87192784841839908a88b6d0623f6278408Richard Smithstruct dr125_A { struct dr125_B {}; };
227ed7dc87192784841839908a88b6d0623f6278408Richard Smithdr125_A::dr125_B dr125_C();
228ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125_B { dr125_A dr125_C(); }
229ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr125 {
230ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct X {
231ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend dr125_A::dr125_B (::dr125_C)(); // ok
232ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend dr125_A (::dr125_B::dr125_C)(); // ok
233ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend dr125_A::dr125_B::dr125_C(); // expected-error {{requires a type specifier}}
234ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
235ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
236ed7dc87192784841839908a88b6d0623f6278408Richard Smith
237ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr126 { // dr126: no
238ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct C {};
239ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct D : C {};
240ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct E : private C { friend class A; friend class B; };
241ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct F : protected C {};
242ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct G : C {};
243ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct H : D, G {};
244ed7dc87192784841839908a88b6d0623f6278408Richard Smith
245ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
246ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cp() throw(C*);
247ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dp() throw(C*);
248ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ep() throw(C*); // expected-note {{overridden}}
249ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fp() throw(C*); // expected-note {{overridden}}
250ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gp() throw(C*);
251ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hp() throw(C*); // expected-note {{overridden}}
252ed7dc87192784841839908a88b6d0623f6278408Richard Smith
253ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cr() throw(C&);
254ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dr() throw(C&);
255ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void er() throw(C&); // expected-note {{overridden}}
256ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fr() throw(C&); // expected-note {{overridden}}
257ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gr() throw(C&);
258ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hr() throw(C&); // expected-note {{overridden}}
259ed7dc87192784841839908a88b6d0623f6278408Richard Smith
260ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void pv() throw(void*); // expected-note {{overridden}}
261ed7dc87192784841839908a88b6d0623f6278408Richard Smith
262ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L
263ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void np() throw(C*); // expected-note {{overridden}}
264ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void npm() throw(int C::*); // expected-note {{overridden}}
265ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void nr() throw(C&); // expected-note {{overridden}}
266ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
267ed7dc87192784841839908a88b6d0623f6278408Richard Smith
268ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref1() throw(C *const&);
269ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref2() throw(C *);
270ed7dc87192784841839908a88b6d0623f6278408Richard Smith
271ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void v() throw(int);
272ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void w() throw(const int);
273ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void x() throw(int*);
274ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void y() throw(const int*);
275ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void z() throw(int); // expected-note {{overridden}}
276ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
277ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : A {
278ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cp() throw(C*);
279ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dp() throw(D*);
280ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ep() throw(E*); // expected-error {{more lax}}
281ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fp() throw(F*); // expected-error {{more lax}}
282ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gp() throw(G*);
283ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hp() throw(H*); // expected-error {{more lax}}
284ed7dc87192784841839908a88b6d0623f6278408Richard Smith
285ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void cr() throw(C&);
286ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void dr() throw(D&);
287ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void er() throw(E&); // expected-error {{more lax}}
288ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void fr() throw(F&); // expected-error {{more lax}}
289ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void gr() throw(G&);
290ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void hr() throw(H&); // expected-error {{more lax}}
291ed7dc87192784841839908a88b6d0623f6278408Richard Smith
292ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void pv() throw(C*); // expected-error {{more lax}} FIXME: This is valid.
293ed7dc87192784841839908a88b6d0623f6278408Richard Smith
294ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus >= 201103L
295ed7dc87192784841839908a88b6d0623f6278408Richard Smith    using nullptr_t = decltype(nullptr);
296ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void np() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid.
297ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void npm() throw(nullptr_t*); // expected-error {{more lax}} FIXME: This is valid.
298ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void nr() throw(nullptr_t&); // expected-error {{more lax}} This is not.
299ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
300ed7dc87192784841839908a88b6d0623f6278408Richard Smith
301ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref1() throw(D *const &);
302ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void ref2() throw(D *);
303ed7dc87192784841839908a88b6d0623f6278408Richard Smith
304ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void v() throw(const int);
305ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void w() throw(int);
306ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void x() throw(const int*); // FIXME: 'const int*' is not allowed by A::h.
307ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void y() throw(int*); // ok
308ed7dc87192784841839908a88b6d0623f6278408Richard Smith    virtual void z() throw(long); // expected-error {{more lax}}
309ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
310ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
311ed7dc87192784841839908a88b6d0623f6278408Richard Smith
312ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr127 { // dr127: yes
3135c8a92ef245c773fa56e66a8c88ae9393eea2fb6Richard Smith  __extension__ typedef __decltype(sizeof(0)) size_t;
314ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct A {
315ed7dc87192784841839908a88b6d0623f6278408Richard Smith    A() throw(int);
316ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void *operator new(size_t, const char * = 0);
317ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void operator delete(void *, const char *) { T::error; } // expected-error 2{{no members}}
318ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void operator delete(void *) { T::error; }
319ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
320ed7dc87192784841839908a88b6d0623f6278408Richard Smith  A<void> *p = new A<void>; // expected-note {{instantiat}}
321ed7dc87192784841839908a88b6d0623f6278408Richard Smith  A<int> *q = new ("") A<int>; // expected-note {{instantiat}}
322ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
323ed7dc87192784841839908a88b6d0623f6278408Richard Smith
324ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr128 { // dr128: yes
325ed7dc87192784841839908a88b6d0623f6278408Richard Smith  enum E1 { e1 } x = e1;
326ed7dc87192784841839908a88b6d0623f6278408Richard Smith  enum E2 { e2 } y = static_cast<E2>(x), z = static_cast<E2>(e1);
327ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
328ed7dc87192784841839908a88b6d0623f6278408Richard Smith
329ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr129: dup 616
330ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr130: na
331ed7dc87192784841839908a88b6d0623f6278408Richard Smith
332ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr131 { // dr131: yes
333ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const char *a_with_\u0e8c = "\u0e8c";
334ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const char *b_with_\u0e8d = "\u0e8d";
335ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const char *c_with_\u0e8e = "\u0e8e";
336ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L
337ed7dc87192784841839908a88b6d0623f6278408Richard Smith  // expected-error@-4 {{expected ';'}} expected-error@-2 {{expected ';'}}
338ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
339ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
340ed7dc87192784841839908a88b6d0623f6278408Richard Smith
341ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr132 { // dr132: no
342ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f() {
343ed7dc87192784841839908a88b6d0623f6278408Richard Smith    extern struct {} x; // ok
344ed7dc87192784841839908a88b6d0623f6278408Richard Smith    extern struct S {} y; // FIXME: This is invalid.
345ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
346ed7dc87192784841839908a88b6d0623f6278408Richard Smith  static enum { E } e;
347ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
348ed7dc87192784841839908a88b6d0623f6278408Richard Smith
349ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr133: dup 87
350ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr134: na
351ed7dc87192784841839908a88b6d0623f6278408Richard Smith
352ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr135 { // dr135: yes
353ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
354ed7dc87192784841839908a88b6d0623f6278408Richard Smith    A f(A a) { return a; }
355ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend A g(A a) { return a; }
356ed7dc87192784841839908a88b6d0623f6278408Richard Smith    static A h(A a) { return a; }
357ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
358ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
359ed7dc87192784841839908a88b6d0623f6278408Richard Smith
360f6a144f5991c6b29622a31fdab86adede0648d12David Majnemernamespace dr136 { // dr136: 3.4
361f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  void f(int, int, int = 0); // expected-note {{previous declaration is here}}
362f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  void g(int, int, int); // expected-note {{previous declaration is here}}
363ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A {
364f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void f(int, int = 0, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
365f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void g(int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
366f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void h(int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be a definition}}
367f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void i(int, int, int = 0) {} // expected-note {{previous declaration is here}}
368ed7dc87192784841839908a88b6d0623f6278408Richard Smith    friend void j(int, int, int = 0) {}
369ed7dc87192784841839908a88b6d0623f6278408Richard Smith    operator int();
370ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
371f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  void i(int, int, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
372ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void q() {
373ed7dc87192784841839908a88b6d0623f6278408Richard Smith    j(A(), A()); // ok, has default argument
374ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
375f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  extern "C" void k(int, int, int, int); // expected-note {{previous declaration is here}}
376f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  namespace NSA {
377f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct A {
378f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void dr136::k(int, int, int, int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}} \
379f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer                                                  // expected-note {{previous declaration is here}}
380f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
381f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  }
382f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  namespace NSB {
383f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct A {
384f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void dr136::k(int, int, int = 0, int); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
385f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
386f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  }
387f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct B {
388f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    void f(int); // expected-note {{previous declaration is here}}
389f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
390f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  struct C {
391f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend void B::f(int = 0); // expected-error {{friend declaration specifying a default argument must be the only declaration}}
392f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer  };
393ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
394ed7dc87192784841839908a88b6d0623f6278408Richard Smith
395ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr137 { // dr137: yes
396ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern void *p;
397ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern const void *cp;
398ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern volatile void *vp;
399ed7dc87192784841839908a88b6d0623f6278408Richard Smith  extern const volatile void *cvp;
400ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *q = static_cast<int*>(p);
401ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *qc = static_cast<int*>(cp); // expected-error {{casts away qualifiers}}
402ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *qv = static_cast<int*>(vp); // expected-error {{casts away qualifiers}}
403ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int *qcv = static_cast<int*>(cvp); // expected-error {{casts away qualifiers}}
404ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cq = static_cast<const int*>(p);
405ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cqc = static_cast<const int*>(cp);
406ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cqv = static_cast<const int*>(vp); // expected-error {{casts away qualifiers}}
407ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const int *cqcv = static_cast<const int*>(cvp); // expected-error {{casts away qualifiers}}
408ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvq = static_cast<const volatile int*>(p);
409ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvqc = static_cast<const volatile int*>(cp);
410ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvqv = static_cast<const volatile int*>(vp);
411ed7dc87192784841839908a88b6d0623f6278408Richard Smith  const volatile int *cvqcv = static_cast<const volatile int*>(cvp);
412ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
413ed7dc87192784841839908a88b6d0623f6278408Richard Smith
414ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr139 { // dr139: yes
415ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example1 {
416ed7dc87192784841839908a88b6d0623f6278408Richard Smith    typedef int f; // expected-note {{previous}}
417ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct A {
418ed7dc87192784841839908a88b6d0623f6278408Richard Smith      friend void f(A &); // expected-error {{different kind of symbol}}
419ed7dc87192784841839908a88b6d0623f6278408Richard Smith    };
420ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
421ed7dc87192784841839908a88b6d0623f6278408Richard Smith
422ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example2 {
423ed7dc87192784841839908a88b6d0623f6278408Richard Smith    typedef int f;
424ed7dc87192784841839908a88b6d0623f6278408Richard Smith    namespace N {
425ed7dc87192784841839908a88b6d0623f6278408Richard Smith      struct A {
426ed7dc87192784841839908a88b6d0623f6278408Richard Smith        friend void f(A &);
427ed7dc87192784841839908a88b6d0623f6278408Richard Smith        operator int();
428ed7dc87192784841839908a88b6d0623f6278408Richard Smith        void g(A a) { int i = f(a); } // ok, f is typedef not friend function
429ed7dc87192784841839908a88b6d0623f6278408Richard Smith      };
430ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
431ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
432ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
433ed7dc87192784841839908a88b6d0623f6278408Richard Smith
434ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr140 { // dr140: yes
435ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f(int *const) {} // expected-note {{previous}}
436ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f(int[3]) {} // expected-error {{redefinition}}
437ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g(const int);
438ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g(int n) { n = 2; }
439ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
440ed7dc87192784841839908a88b6d0623f6278408Richard Smith
441ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr141 { // dr141: yes
442ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> void f();
443ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct S { int n; };
444ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A : S<int> {
445ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> void f();
446ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> struct S {};
447ed7dc87192784841839908a88b6d0623f6278408Richard Smith  } a;
448ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct B : S<int> {} b;
449ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g() {
450ed7dc87192784841839908a88b6d0623f6278408Richard Smith    a.f<int>();
451ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)a.S<int>::n; // expected-error {{no member named 'n'}}
452ed7dc87192784841839908a88b6d0623f6278408Richard Smith#if __cplusplus < 201103L
453ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // expected-error@-2 {{ambiguous}}
454ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // expected-note@-11 {{lookup from the current scope}}
455ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // expected-note@-9 {{lookup in the object type}}
456ed7dc87192784841839908a88b6d0623f6278408Richard Smith#endif
457ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b.f<int>(); // expected-error {{no member}} expected-error +{{}}
458ed7dc87192784841839908a88b6d0623f6278408Richard Smith    (void)b.S<int>::n;
459ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
460ed7dc87192784841839908a88b6d0623f6278408Richard Smith  template<typename T> struct C {
461ed7dc87192784841839908a88b6d0623f6278408Richard Smith    T t;
462ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void g() {
463ed7dc87192784841839908a88b6d0623f6278408Richard Smith      t.f<int>(); // expected-error {{use 'template'}}
464ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
465ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void h() {
466ed7dc87192784841839908a88b6d0623f6278408Richard Smith      (void)t.S<int>::n; // ok
467ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
468ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void i() {
469ed7dc87192784841839908a88b6d0623f6278408Richard Smith      (void)t.S<int>(); // ok!
470ed7dc87192784841839908a88b6d0623f6278408Richard Smith    }
471ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
472ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void h() { C<B>().h(); } // ok
473ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct X {
474ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename T> void S();
475ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
476ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void i() { C<X>().i(); } // ok!!
477ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
478ed7dc87192784841839908a88b6d0623f6278408Richard Smith
479ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr142 { // dr142: yes
480ed7dc87192784841839908a88b6d0623f6278408Richard Smith  class B { // expected-note +{{here}}
481ed7dc87192784841839908a88b6d0623f6278408Richard Smith  public:
482ed7dc87192784841839908a88b6d0623f6278408Richard Smith    int mi; // expected-note +{{here}}
483ed7dc87192784841839908a88b6d0623f6278408Richard Smith    static int si; // expected-note +{{here}}
484ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
485ed7dc87192784841839908a88b6d0623f6278408Richard Smith  class D : private B { // expected-note +{{here}}
486ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
487ed7dc87192784841839908a88b6d0623f6278408Richard Smith  class DD : public D {
488ed7dc87192784841839908a88b6d0623f6278408Richard Smith    void f();
489ed7dc87192784841839908a88b6d0623f6278408Richard Smith  };
490ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void DD::f() {
491ed7dc87192784841839908a88b6d0623f6278408Richard Smith    mi = 3; // expected-error {{private base class}} expected-error {{private member}}
492ed7dc87192784841839908a88b6d0623f6278408Richard Smith    si = 3; // expected-error {{private member}}
493ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B b_old; // expected-error {{private member}}
494ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B b;
495ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b.mi = 3;
496ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b.si = 3;
497ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B::si = 3; // expected-error {{private member}}
498ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B::si = 3;
499ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B *bp1_old = this; // expected-error {{private member}} expected-error {{private base class}}
500ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B *bp1 = this; // expected-error {{private base class}}
501ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B *bp2_old = (B*)this; // expected-error 2{{private member}}
502ed7dc87192784841839908a88b6d0623f6278408Richard Smith    dr142::B *bp2 = (dr142::B*)this;
503ed7dc87192784841839908a88b6d0623f6278408Richard Smith    bp2->mi = 3;
504ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
505ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
506ed7dc87192784841839908a88b6d0623f6278408Richard Smith
507ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr143 { // dr143: yes
508ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace A { struct X; }
509ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace B { void f(A::X); }
510ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace A {
511ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct X { friend void B::f(X); };
512ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
513ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void g(A::X x) {
514ed7dc87192784841839908a88b6d0623f6278408Richard Smith    f(x); // expected-error {{undeclared identifier 'f'}}
515ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
516ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
517ed7dc87192784841839908a88b6d0623f6278408Richard Smith
518ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr145 { // dr145: yes
519ed7dc87192784841839908a88b6d0623f6278408Richard Smith  void f(bool b) {
520ed7dc87192784841839908a88b6d0623f6278408Richard Smith    ++b; // expected-warning {{deprecated}}
521ed7dc87192784841839908a88b6d0623f6278408Richard Smith    b++; // expected-warning {{deprecated}}
522ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
523ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
524ed7dc87192784841839908a88b6d0623f6278408Richard Smith
525ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr147 { // dr147: no
526ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example1 {
527ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename> struct A {
528ed7dc87192784841839908a88b6d0623f6278408Richard Smith      template<typename T> A(T);
529ed7dc87192784841839908a88b6d0623f6278408Richard Smith    };
530ed7dc87192784841839908a88b6d0623f6278408Richard Smith    // FIXME: This appears to be valid, and EDG and G++ accept.
531ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<> template<> A<int>::A<int>(int) {} // expected-error {{out-of-line constructor for 'A' cannot have template arguments}}
532ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
533ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example2 {
534ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct A { A(); };
535ed7dc87192784841839908a88b6d0623f6278408Richard Smith    struct B : A { B(); };
536ed7dc87192784841839908a88b6d0623f6278408Richard Smith    A::A a1; // expected-error {{is a constructor}}
537ed7dc87192784841839908a88b6d0623f6278408Richard Smith    B::A a2;
538ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
539ed7dc87192784841839908a88b6d0623f6278408Richard Smith  namespace example3 {
540ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<typename> struct A {
541ed7dc87192784841839908a88b6d0623f6278408Richard Smith      template<typename T> A(T);
542ed7dc87192784841839908a88b6d0623f6278408Richard Smith      static A a;
543ed7dc87192784841839908a88b6d0623f6278408Richard Smith    };
544ed7dc87192784841839908a88b6d0623f6278408Richard Smith    template<> A<int>::A<int>(A<int>::a); // expected-error {{is a constructor}}
545ed7dc87192784841839908a88b6d0623f6278408Richard Smith  }
546ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
547ed7dc87192784841839908a88b6d0623f6278408Richard Smith
548ed7dc87192784841839908a88b6d0623f6278408Richard Smithnamespace dr148 { // dr148: yes
549ed7dc87192784841839908a88b6d0623f6278408Richard Smith  struct A { int A::*p; };
550ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int check1[__is_pod(int(A::*)) ? 1 : -1];
551ed7dc87192784841839908a88b6d0623f6278408Richard Smith  int check2[__is_pod(A) ? 1 : -1];
552ed7dc87192784841839908a88b6d0623f6278408Richard Smith}
553ed7dc87192784841839908a88b6d0623f6278408Richard Smith
554ed7dc87192784841839908a88b6d0623f6278408Richard Smith// dr149: na
555