1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregornamespace A
6fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor{
7fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    namespace B
8fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        struct base
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // expected-note@-2 {{lookup in the object type 'A::sub' refers here}}
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
13fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        {
14fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor            void x() {}
15fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor            void y() {}
16fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        };
17fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    }
18fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
19fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    struct member
20fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
21fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        void foo();
22fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    };
23fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
24fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    struct middleman
25fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
26fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        member * operator->() { return 0; }
27fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    };
28fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
29fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    struct sub : B::base
30fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
31fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        void x() {}
32fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        middleman operator->() { return middleman(); }
33fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    };
34fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor}
35fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
36fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregorstruct bad
37fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor{
38fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor  int x();
39fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor};
40fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
41fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregornamespace C
42fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor{
43fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    void fun()
44fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
45fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        A::sub a;
46fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
47fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.x();
48fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
49fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.sub::x();
50fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.base::x();
51fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
52fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
53fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
54fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.A::sub::x();
55fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.A::B::base::x();
56fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
57110acc1ae8d978f9b423394eaf0cace61b1339f0John McCall        a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
58fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
59fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->foo();
60fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->member::foo();
61fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->A::member::foo();
62fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    }
63fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
64fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    void fun2()
65fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
66fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        A::sub *a;
67fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
68fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->x();
69fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
70fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->sub::x();
71fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->base::x();
72fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
73fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
74fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
75fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->A::sub::x();
76fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->A::B::base::x();
77fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
78110acc1ae8d978f9b423394eaf0cace61b1339f0John McCall        a->bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
79fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
80fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        (*a)->foo();
81fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        (*a)->member::foo();
82fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        (*a)->A::member::foo();
83fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    }
84fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
85fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    void fun3()
86fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
87fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        int i;
88fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        i.foo(); // expected-error{{member reference base type 'int' is not a structure or union}}
89fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    }
90fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
912dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor    void fun4a() {
922dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor      A::sub *a;
932dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      typedef A::member base;
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // expected-note@-2 {{lookup from the current scope refers here}}
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      a->base::x();
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __cplusplus <= 199711L
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // expected-error@-2 {{lookup of 'base' in member access expression is ambiguous}}
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1022dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor    }
1032dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
1042dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor    void fun4b() {
1052dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor      A::sub *a;
1062dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
1072dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor      typedef A::B::base base;
1082dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor      a->base::x();
1092dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor    }
1102dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
111fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    template<typename T>
1122dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor    void fun5()
113fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    {
114fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        T a;
115fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.x();
116fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->foo();
117fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
118fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.A::sub::x();
119fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a.A::B::base::x();
120fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor        a->A::member::foo();
121fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor
122110acc1ae8d978f9b423394eaf0cace61b1339f0John McCall        a.bad::x(); // expected-error{{'bad::x' is not a member of class 'A::sub'}}
123fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor    }
124c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor
125a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  void test_fun5() {
126c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    fun5<A::sub>(); // expected-note{{instantiation}}
127a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  }
128c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor
129c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  template<typename T>
130c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  void fun6() {
131c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    T a;
132c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    a.sub::x();
133c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    a.base::x();
134c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    a->member::foo();
135c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    a.B::base::x(); // expected-error{{use of undeclared identifier 'B'}}
136c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor   }
137c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor
138c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  void test_fun6() {
139c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor    fun6<A::sub>(); // expected-note{{instantiation}}
140c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor  }
141c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor
142fe85cedd58df7daed29201703cfb8806e12876d0Douglas Gregor}
1432dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
1442dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor// PR4703
1452dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregorstruct a {
1462dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor  int a;
1472dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor  static int sa;
1482dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor};
1492dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
1502dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregora a;
1512dd078ae50ff7be1fb25ebeedde45e9ab691a4f0Douglas Gregor
152a85cf39786fffd6860a940523be01eb02a4935c0Richard Smithint a::sa = a.a; // expected-error {{invalid use of non-static data member 'a'}}
1539de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor
1549de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor
1559de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregornamespace PR6645 {
1569de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor  typedef int foo;
1579de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor  namespace Inner {
1589de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor    typedef int PR6645::foo; // expected-error{{typedef declarator cannot be qualified}} \
159a1c4f7c833093f87d5187c4449a3d4534cfa40a4Richard Smith    // expected-error{{cannot define or redeclare 'foo' here because namespace 'Inner' does not enclose namespace 'PR6645'}}
1609de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor  }
1619de672f6eb4a1f076163fd826418ca179e1341ecDouglas Gregor}
162