Home | History | Annotate | Download | only in class.friend
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 // rdar://problem/8540720
      4 namespace test0 {
      5   void foo() {
      6     void bar();
      7     class A {
      8       friend void bar();
      9     };
     10   }
     11 }
     12 
     13 namespace test1 {
     14   void foo() {
     15     class A {
     16       friend void bar(); // expected-error {{no matching function found in local scope}}
     17     };
     18   }
     19 }
     20 
     21 namespace test2 {
     22   void bar(); // expected-note {{'::test2::bar' declared here}}
     23 
     24   void foo() { // expected-note {{'::test2::foo' declared here}}
     25     struct S1 {
     26       friend void foo(); // expected-error {{no matching function 'foo' found in local scope; did you mean '::test2::foo'?}}
     27     };
     28 
     29     void foo(); // expected-note {{local declaration nearly matches}}
     30     struct S2 {
     31       friend void foo(); // expected-note{{'::test2::foo' declared here}}
     32       // TODO: the above note should go on line 24
     33     };
     34 
     35     {
     36       struct S2 {
     37         friend void foo(); // expected-error {{no matching function found in local scope}}
     38       };
     39     }
     40 
     41     {
     42       int foo;
     43       struct S3 {
     44         friend void foo(); // expected-error {{no matching function 'foo' found in local scope; did you mean '::test2::foo'?}}
     45       };
     46     }
     47 
     48     struct S4 {
     49       friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
     50       // expected-note@-1 {{'::test2::bar' declared here}}
     51       // TODO: the above note should go on line 22
     52     };
     53 
     54     { void bar(); }
     55     struct S5 {
     56       friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
     57     };
     58 
     59     {
     60       void bar();
     61       struct S6 {
     62         friend void bar();
     63       };
     64     }
     65 
     66     struct S7 {
     67       void bar() { Inner::f(); }
     68       struct Inner {
     69         friend void bar();
     70         static void f() {}
     71       };
     72     };
     73 
     74     void bar(); // expected-note {{'bar' declared here}}
     75     struct S8 {
     76       struct Inner {
     77         friend void bar();
     78       };
     79     };
     80 
     81     struct S9 {
     82       struct Inner {
     83         friend void baz(); // expected-error {{no matching function 'baz' found in local scope; did you mean 'bar'?}}
     84         // expected-note@-1 {{'::test2::bar' declared here}}
     85         // TODO: the above note should go on line 22
     86       };
     87     };
     88 
     89     struct S10 {
     90       void quux() {}
     91       void foo() {
     92         struct Inner1 {
     93           friend void bar(); // expected-error {{no matching function 'bar' found in local scope; did you mean '::test2::bar'?}}
     94           friend void quux(); // expected-error {{no matching function found in local scope}}
     95         };
     96 
     97         void bar();
     98         struct Inner2 {
     99           friend void bar();
    100         };
    101       }
    102     };
    103   }
    104 }
    105