1// RUN: %clang_cc1 -fsyntax-only -verify %s
2// expected-no-diagnostics
3
4// C++0x [basic.lookup.unqual]p14:
5//   If a variable member of a namespace is defined outside of the
6//   scope of its namespace then any name used in the definition of
7//   the variable member (after the declarator-id) is looked up as if
8//   the definition of the variable member occurred in its namespace.
9
10namespace N {
11  struct S {};
12  S i;
13  extern S j;
14  extern S j2;
15}
16
17int i = 2;
18N::S N::j = i;
19N::S N::j2(i);
20
21// <rdar://problem/13317030>
22namespace M {
23  class X { };
24  inline X operator-(int, X);
25
26  template<typename T>
27  class Y { };
28
29  typedef Y<float> YFloat;
30
31  namespace yfloat {
32    YFloat operator-(YFloat, YFloat);
33  }
34  using namespace yfloat;
35}
36
37using namespace M;
38
39namespace M {
40
41class Other {
42  void foo(YFloat a, YFloat b);
43};
44
45}
46
47void Other::foo(YFloat a, YFloat b) {
48  YFloat c = a - b;
49}
50
51// <rdar://problem/13540899>
52namespace Other {
53  void other_foo();
54}
55
56namespace M2 {
57  using namespace Other;
58
59  extern "C" {
60    namespace MInner {
61      extern "C" {
62        class Bar {
63          void bar();
64        };
65      }
66    }
67  }
68}
69
70void M2::MInner::Bar::bar() {
71  other_foo();
72}
73