p1.cpp revision 02cace78cf48cc26686bd5b07c78606abca13bcd
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  friend class UndeclaredSoFar;
41  UndeclaredSoFar x; // expected-error {{ unknown type name 'UndeclaredSoFar' }}
42
43  void a_member();
44  friend void A::a_member(); // expected-error {{ friends cannot be members of the declaring class }}
45  friend void a_member(); // okay (because we ignore class scopes when looking up friends)
46  friend class A::AInner; // this is okay as an extension
47  friend class AInner; // okay, refers to ::AInner
48
49  friend void Derived::missing_member(); // expected-error {{ no function named 'missing_member' with type 'void ()' was found in the specified scope }}
50
51  friend void Derived::base_member(); // expected-error {{ no function named 'base_member' with type 'void ()' was found in the specified scope }}
52
53  friend int Base::typedeffed_member(); // okay: should look through typedef
54
55  // These test that the friend is properly not being treated as a
56  // member function.
57  friend A operator|(const A& l, const A& r); // okay
58  friend A operator|(const A& r); // expected-error {{ overloaded 'operator|' must be a binary operator (has 1 parameter) }}
59
60  friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }}
61
62  typedef void ftypedef();
63  friend ftypedef typedeffed_function; // okay (because it's not declared as a member)
64};
65
66class UndeclaredSoFar { };
67
68A::UndeclaredSoFar y; // expected-error {{ unknown type name 'UndeclaredSoFar' }}
69
70class PreDeclared;
71
72int myoperation(float f) {
73  return (int) f;
74}
75