1*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -fms-extensions -std=c++11 -verify 2*67e74705SXin Li 3*67e74705SXin Li struct Errors { 4*67e74705SXin Li using __super::foo; // expected-error {{'__super' cannot be used with a using declaration}} 5*67e74705SXin Li __super::XXX x; // expected-error {{invalid use of '__super', Errors has no base classes}} expected-error {{expected}} 6*67e74705SXin Li fooErrors7*67e74705SXin Li void foo() { 8*67e74705SXin Li // expected-note@+4 {{replace parentheses with an initializer to declare a variable}} 9*67e74705SXin Li // expected-warning@+3 {{empty parentheses interpreted as a function declaration}} 10*67e74705SXin Li // expected-error@+2 {{C++ requires a type specifier for all declarations}} 11*67e74705SXin Li // expected-error@+1 {{use of '__super' inside a lambda is unsupported}} 12*67e74705SXin Li auto lambda = []{ __super::foo(); }; 13*67e74705SXin Li } 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li struct Base1 { fooBase117*67e74705SXin Li void foo(int) {} 18*67e74705SXin Li static_fooBase119*67e74705SXin Li static void static_foo() {} 20*67e74705SXin Li 21*67e74705SXin Li typedef int XXX; 22*67e74705SXin Li }; 23*67e74705SXin Li 24*67e74705SXin Li struct Derived : Base1 { 25*67e74705SXin Li __super::XXX x; 26*67e74705SXin Li typedef __super::XXX Type; 27*67e74705SXin Li 28*67e74705SXin Li enum E { 29*67e74705SXin Li X = sizeof(__super::XXX) 30*67e74705SXin Li }; 31*67e74705SXin Li fooDerived32*67e74705SXin Li void foo() { 33*67e74705SXin Li __super::foo(1); 34*67e74705SXin Li 35*67e74705SXin Li if (true) { 36*67e74705SXin Li __super::foo(1); 37*67e74705SXin Li } 38*67e74705SXin Li 39*67e74705SXin Li return __super::foo(1); 40*67e74705SXin Li } 41*67e74705SXin Li barDerived42*67e74705SXin Li static void bar() { 43*67e74705SXin Li __super::static_foo(); 44*67e74705SXin Li } 45*67e74705SXin Li }; 46*67e74705SXin Li 47*67e74705SXin Li struct Outer { 48*67e74705SXin Li struct Inner : Base1 { 49*67e74705SXin Li static const int x = sizeof(__super::XXX); 50*67e74705SXin Li }; 51*67e74705SXin Li }; 52*67e74705SXin Li 53*67e74705SXin Li struct Base2 { fooBase254*67e74705SXin Li void foo(char) {} 55*67e74705SXin Li }; 56*67e74705SXin Li 57*67e74705SXin Li struct MemberFunctionInMultipleBases : Base1, Base2 { fooMemberFunctionInMultipleBases58*67e74705SXin Li void foo() { 59*67e74705SXin Li __super::foo('x'); 60*67e74705SXin Li } 61*67e74705SXin Li }; 62*67e74705SXin Li 63*67e74705SXin Li struct Base3 { fooBase364*67e74705SXin Li void foo(int) {} fooBase365*67e74705SXin Li void foo(char) {} 66*67e74705SXin Li }; 67*67e74705SXin Li 68*67e74705SXin Li struct OverloadedMemberFunction : Base3 { fooOverloadedMemberFunction69*67e74705SXin Li void foo() { 70*67e74705SXin Li __super::foo('x'); 71*67e74705SXin Li } 72*67e74705SXin Li }; 73*67e74705SXin Li 74*67e74705SXin Li struct PointerToMember : Base1 { 75*67e74705SXin Li template <void (Base1::*MP)(int)> 76*67e74705SXin Li struct Wrapper { barPointerToMember::Wrapper77*67e74705SXin Li static void bar() {} 78*67e74705SXin Li }; 79*67e74705SXin Li 80*67e74705SXin Li void baz(); 81*67e74705SXin Li }; 82*67e74705SXin Li baz()83*67e74705SXin Livoid PointerToMember::baz() { 84*67e74705SXin Li Wrapper<&__super::foo>::bar(); 85*67e74705SXin Li } 86*67e74705SXin Li 87*67e74705SXin Li template <typename T> 88*67e74705SXin Li struct BaseTemplate { 89*67e74705SXin Li typedef int XXX; 90*67e74705SXin Li fooBaseTemplate91*67e74705SXin Li int foo() { return 0; } 92*67e74705SXin Li }; 93*67e74705SXin Li 94*67e74705SXin Li struct DerivedFromKnownSpecialization : BaseTemplate<int> { 95*67e74705SXin Li __super::XXX a; 96*67e74705SXin Li typedef __super::XXX b; 97*67e74705SXin Li fooDerivedFromKnownSpecialization98*67e74705SXin Li void foo() { 99*67e74705SXin Li __super::XXX c; 100*67e74705SXin Li typedef __super::XXX d; 101*67e74705SXin Li 102*67e74705SXin Li __super::foo(); 103*67e74705SXin Li } 104*67e74705SXin Li }; 105*67e74705SXin Li 106*67e74705SXin Li template <typename T> 107*67e74705SXin Li struct DerivedFromDependentBase : BaseTemplate<T> { 108*67e74705SXin Li typename __super::XXX a; 109*67e74705SXin Li typedef typename __super::XXX b; 110*67e74705SXin Li 111*67e74705SXin Li __super::XXX c; // expected-error {{missing 'typename'}} 112*67e74705SXin Li typedef __super::XXX d; // expected-error {{missing 'typename'}} 113*67e74705SXin Li fooDerivedFromDependentBase114*67e74705SXin Li void foo() { 115*67e74705SXin Li typename __super::XXX e; 116*67e74705SXin Li typedef typename __super::XXX f; 117*67e74705SXin Li 118*67e74705SXin Li __super::XXX g; // expected-error {{missing 'typename'}} 119*67e74705SXin Li typedef __super::XXX h; // expected-error {{missing 'typename'}} 120*67e74705SXin Li 121*67e74705SXin Li int x = __super::foo(); 122*67e74705SXin Li } 123*67e74705SXin Li }; 124*67e74705SXin Li 125*67e74705SXin Li template <typename T> 126*67e74705SXin Li struct DerivedFromTemplateParameter : T { 127*67e74705SXin Li typename __super::XXX a; 128*67e74705SXin Li typedef typename __super::XXX b; 129*67e74705SXin Li 130*67e74705SXin Li __super::XXX c; // expected-error {{missing 'typename'}} 131*67e74705SXin Li typedef __super::XXX d; // expected-error {{missing 'typename'}} 132*67e74705SXin Li fooDerivedFromTemplateParameter133*67e74705SXin Li void foo() { 134*67e74705SXin Li typename __super::XXX e; 135*67e74705SXin Li typedef typename __super::XXX f; 136*67e74705SXin Li 137*67e74705SXin Li __super::XXX g; // expected-error {{missing 'typename'}} 138*67e74705SXin Li typedef __super::XXX h; // expected-error {{missing 'typename'}} 139*67e74705SXin Li 140*67e74705SXin Li __super::foo(1); 141*67e74705SXin Li } 142*67e74705SXin Li }; 143*67e74705SXin Li instantiate()144*67e74705SXin Livoid instantiate() { 145*67e74705SXin Li DerivedFromDependentBase<int> d; 146*67e74705SXin Li d.foo(); 147*67e74705SXin Li DerivedFromTemplateParameter<Base1> t; 148*67e74705SXin Li t.foo(); 149*67e74705SXin Li } 150*67e74705SXin Li 151*67e74705SXin Li namespace { 152*67e74705SXin Li struct B { int a; }; 153*67e74705SXin Li template <class C> 154*67e74705SXin Li struct A : B { 155*67e74705SXin Li // Don't crash on dependent_type_var '->' '__super' f__anonbbae92080211::A156*67e74705SXin Li void f() { int a = this->__super::a; } 157*67e74705SXin Li }; 158*67e74705SXin Li } 159