p11.cpp revision 0e2c34f92f00628d48968dfea096d36381f494cb
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'?}}
270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // expected-note@-1{{'::test2::foo' declared here}}
280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // TODO: the above note should go on line 24
294e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
304e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
314e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    void foo(); // expected-note {{local declaration nearly matches}}
324e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S2 {
334e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      friend void foo();
344e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
354e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
364e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    {
374e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct S2 {
384e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void foo(); // expected-error {{no matching function found in local scope}}
394e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
404e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    }
414e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
424e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    {
434e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      int foo;
444e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct S3 {
450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        friend void foo(); // expected-error {{no matching function 'foo' found in local scope; did you mean '::test2::foo'?}}
464e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
474e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    }
484e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
494e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S4 {
504e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // expected-note@-1 2 {{'::test2::bar' declared here}}
520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // TODO: the above two notes should go on line 22
534e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
544e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
554e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    { void bar(); }
564e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S5 {
570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
584e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
594e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
604e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    {
614e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void bar();
624e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct S6 {
634e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void bar();
644e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
654e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    }
664e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
674e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S7 {
684e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void bar() { Inner::f(); }
694e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct Inner {
704e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void bar();
714e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        static void f() {}
724e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
734e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
744e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
754e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    void bar(); // expected-note {{'bar' declared here}}
764e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S8 {
774e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct Inner {
784e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void bar();
794e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
804e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
814e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
824e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S9 {
834e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      struct Inner {
844e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        friend void baz(); // expected-error {{no matching function 'baz' found in local scope; did you mean 'bar'?}}
854e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      };
864e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
874e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
884e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    struct S10 {
894e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void quux() {}
904e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      void foo() {
914e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        struct Inner1 {
920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
934e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith          friend void quux(); // expected-error {{no matching function found in local scope}}
944e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        };
954e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith
964e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        void bar();
974e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        struct Inner2 {
984e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith          friend void bar();
994e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith        };
1004e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith      }
1014e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith    };
1024e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith  }
1034e9686b1f9947f1747b4f4316deb2087a7f56282Richard Smith}
104