1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | typedef void F() const; |
4 | |
5 | void f() const; // expected-error {{non-member function cannot have 'const' qualifier}} |
6 | F g; // expected-error {{non-member function of type 'F' (aka 'void () const') cannot have 'const' qualifier}} |
7 | |
8 | struct X { |
9 | void f() const; |
10 | friend void g() const; // expected-error {{non-member function cannot have 'const' qualifier}} |
11 | static void h() const; // expected-error {{static member function cannot have 'const' qualifier}} |
12 | F i; // ok |
13 | friend F j; // expected-error {{non-member function of type 'F' (aka 'void () const') cannot have 'const' qualifier}} |
14 | static F k; // expected-error {{static member function of type 'F' (aka 'void () const') cannot have 'const' qualifier}} |
15 | }; |
16 | |
17 | struct Y { |
18 | friend void X::f() const; |
19 | friend void ::f() const; // expected-error {{non-member function cannot have 'const' qualifier}} |
20 | }; |
21 | |
22 | template<typename T> struct S { |
23 | typedef T F; |
24 | typedef T *P; // expected-error {{pointer to function type 'void () const' cannot have 'const' qualifier}} |
25 | typedef T &R; // expected-error {{reference to function type 'void () const' cannot have 'const' qualifier}} |
26 | }; |
27 | S<F> s; // expected-note {{in instantiation of}} |
28 | |
29 | // FIXME: This is ill-formed. |
30 | template<typename T> struct U { |
31 | void f(T); |
32 | }; |
33 | U<F> u; |
34 | |