p1.cpp revision d37b360bf9f954af119c9805fdc79ab9d30e06c6
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -verify %s
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Outer {
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Inner {
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int intfield;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Base {
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void base_member();
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef int Int;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Int typedeffed_member();
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Derived : public Base {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int myglobal;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void global_function();
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern "C" {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void global_c_function();
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass A {
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  class AInner {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PreDeclared;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class Outer::Inner;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend int Outer::Inner::intfield; // expected-error {{friends can only be classes or functions}}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend int Outer::Inner::missing_field; //expected-error {{friends can only be classes or functions}}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend int myoperation(float); // okay
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend int myglobal;   // expected-error {{friends can only be classes or functions}}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend void global_function();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend void global_c_function();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class UndeclaredSoFar;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UndeclaredSoFar x; // expected-error {{unknown type name 'UndeclaredSoFar'}}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void a_member();
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend void A::a_member(); // expected-error {{friends cannot be members of the declaring class}}
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend void a_member(); // okay (because we ignore class scopes when looking up friends)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class A::AInner; // this is okay as an extension
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class AInner; // okay, refers to ::AInner
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend void Derived::missing_member(); // expected-error {{no function named 'missing_member' with type 'void ()' was found in the specified scope}}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend void Derived::base_member(); // expected-error {{no function named 'base_member' with type 'void ()' was found in the specified scope}}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend int Base::typedeffed_member(); // okay: should look through typedef
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These test that the friend is properly not being treated as a
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // member function.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend A operator|(const A& l, const A& r); // okay
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend A operator|(const A& r); // expected-error {{overloaded 'operator|' must be a binary operator (has 1 parameter)}}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend operator bool() const; // expected-error {{must use a qualified name when declaring a conversion operator as a friend}} \
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       // expected-error{{non-member function cannot have 'const' qualifier}}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void ftypedef();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend ftypedef typedeffed_function; // okay (because it's not declared as a member)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class facet;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class facet;  // should not assert
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class facet {};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)A::UndeclaredSoFar y; // expected-error {{no type named 'UndeclaredSoFar' in 'A'}}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PreDeclared;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int myoperation(float f) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (int) f;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)