p1.cpp revision 91cf4199cca311ea9c3b3a4e2b3984d508c9e5e3
1// RUN: clang-cc -fsyntax-only -verify %s
2
3struct Outer {
4  struct Inner {
5    int intfield;
6  };
7};
8
9struct Base {
10  void base_member();
11
12  typedef int Int;
13  Int typedeffed_member();
14};
15
16struct Derived : public Base {
17};
18
19int myglobal;
20
21void global_function();
22extern "C" {
23  void global_c_function();
24}
25
26class A {
27  class AInner {
28  };
29
30  friend class PreDeclared;
31  friend class Outer::Inner;
32  friend int Outer::Inner::intfield; // expected-error {{ friends can only be classes or functions }}
33  friend int Outer::Inner::missing_field; //expected-error {{ friends can only be classes or functions }}
34  friend int myoperation(float); // okay
35  friend int myglobal;   // expected-error {{ friends can only be classes or functions }}
36
37  friend void global_function();
38  friend void global_c_function();
39
40  void a_member();
41  friend void A::a_member(); // expected-error {{ friends cannot be members of the declaring class }}
42  friend void a_member(); // okay (because we ignore class scopes when looking up friends)
43  friend class A::AInner; // this is okay as an extension
44  friend class AInner; // okay, refers to ::AInner
45
46  friend void Derived::missing_member(); // expected-error {{ no function named 'missing_member' with type 'void ()' was found in the specified scope }}
47
48  friend void Derived::base_member(); // expected-error {{ no function named 'base_member' with type 'void ()' was found in the specified scope }}
49
50  friend int Base::typedeffed_member(); // okay: should look through typedef
51
52  // These test that the friend is properly not being treated as a
53  // member function.
54  friend A operator|(const A& l, const A& r); // okay
55  friend A operator|(const A& r); // expected-error {{ overloaded 'operator|' must be a binary operator (has 1 parameter) }}
56
57  friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }}
58
59  typedef void ftypedef();
60  friend ftypedef typedeffed_function; // okay (because it's not declared as a member)
61};
62
63class PreDeclared;
64
65int myoperation(float f) {
66  return (int) f;
67}
68