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