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