p11.cpp revision 4e9686b1f9947f1747b4f4316deb2087a7f56282
129ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall// RUN: %clang_cc1 -fsyntax-only -verify %s
229ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall
329ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall// rdar://problem/8540720
429ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCallnamespace test0 {
529ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall  void foo() {
629ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall    void bar();
729ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall    class A {
829ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall      friend void bar();
929ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall    };
1029ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall  }
1129ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall}
1229ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall
1329ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCallnamespace test1 {
1429ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall  void foo() {
1529ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall    class A {
1629ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall      friend void bar(); // expected-error {{no matching function found in local scope}}
1729ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall    };
1829ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall  }
1929ae6e5fb001deddd831e66faf143ecd9e50f67cJohn McCall}
204e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
214e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smithnamespace test2 {
224e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith  void bar(); // expected-note {{'::test2::bar' declared here}}
234e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
244e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith  void foo() { // expected-note {{'::test2::foo' declared here}}
254e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S1 {
264e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      friend void foo(); // expected-error {{no matching function 'foo' found in local scope; did you mean '::test2::foo'?}}
274e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
284e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
294e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    void foo(); // expected-note {{local declaration nearly matches}}
304e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S2 {
314e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      friend void foo();
324e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
334e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
344e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    {
354e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct S2 {
364e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void foo(); // expected-error {{no matching function found in local scope}}
374e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
384e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    }
394e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
404e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    {
414e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      int foo;
424e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct S3 {
434e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void foo(); // expected-error {{no matching function found in local scope}}
444e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
454e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    }
464e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
474e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S4 {
484e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
494e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
504e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
514e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    { void bar(); }
524e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S5 {
534e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      friend void bar(); // expected-error {{no matching function found in local scope}}
544e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
554e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
564e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    {
574e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void bar();
584e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct S6 {
594e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void bar();
604e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
614e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    }
624e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
634e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S7 {
644e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void bar() { Inner::f(); }
654e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct Inner {
664e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void bar();
674e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        static void f() {}
684e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
694e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
704e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
714e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    void bar(); // expected-note {{'bar' declared here}}
724e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S8 {
734e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct Inner {
744e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void bar();
754e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
764e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
774e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
784e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S9 {
794e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct Inner {
804e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void baz(); // expected-error {{no matching function 'baz' found in local scope; did you mean 'bar'?}}
814e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
824e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
834e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
844e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S10 {
854e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void quux() {}
864e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void foo() {
874e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        struct Inner1 {
884e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith          friend void bar(); // expected-error {{no matching function found in local scope}}
894e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith          friend void quux(); // expected-error {{no matching function found in local scope}}
904e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        };
914e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
924e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        void bar();
934e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        struct Inner2 {
944e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith          friend void bar();
954e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        };
964e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      }
974e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
984e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith  }
994e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith}
100