xref: /aosp_15_r20/external/clang/test/SemaCXX/MicrosoftSuper.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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