p1.cpp revision 67d1a67f3db2f1aa69083c5c94164d6e0ee05b32
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
21class A {
22  class AInner {
23  };
24
25  friend class PreDeclared;
26  friend class Outer::Inner;
27  friend int Outer::Inner::intfield; // expected-error {{ friends can only be classes or functions }}
28  friend int Outer::Inner::missing_field; //expected-error {{ friends can only be classes or functions }}
29  friend int myoperation(float); // okay
30  friend int myglobal;   // expected-error {{ friends can only be classes or functions }}
31
32  void a_member();
33  friend void A::a_member(); // expected-error {{ friends cannot be members of the declaring class }}
34  friend void a_member(); // okay (because we ignore class scopes when looking up friends)
35  friend class A::AInner; // expected-error {{ friends cannot be members of the declaring class }}
36  friend class AInner; // expected-error {{ friends cannot be members of the declaring class }}
37
38  friend void Derived::missing_member(); // expected-error {{ no function named 'missing_member' with type 'void ()' was found in the specified scope }}
39
40  friend void Derived::base_member(); // expected-error {{ no function named 'base_member' with type 'void ()' was found in the specified scope }}
41
42  friend int Base::typedeffed_member(); // okay: should look through typedef
43
44  // These test that the friend is properly not being treated as a
45  // member function.
46  friend A operator|(const A& l, const A& r); // okay
47  friend A operator|(const A& r); // expected-error {{ overloaded 'operator|' must be a binary operator (has 1 parameter) }}
48
49  friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }}
50
51  typedef void ftypedef();
52  friend ftypedef typedeffed_function; // okay (because it's not declared as a member)
53};
54
55class PreDeclared;
56
57int myoperation(float f) {
58  return (int) f;
59}
60