159 lines
3.2 KiB
C++
159 lines
3.2 KiB
C++
|
// RUN: %clang_cc1 %s -fsyntax-only -fms-extensions -std=c++11 -verify
|
||
|
|
||
|
struct Errors {
|
||
|
using __super::foo; // expected-error {{'__super' cannot be used with a using declaration}}
|
||
|
__super::XXX x; // expected-error {{invalid use of '__super', Errors has no base classes}} expected-error {{expected}}
|
||
|
|
||
|
void foo() {
|
||
|
// expected-note@+4 {{replace parentheses with an initializer to declare a variable}}
|
||
|
// expected-warning@+3 {{empty parentheses interpreted as a function declaration}}
|
||
|
// expected-error@+2 {{C++ requires a type specifier for all declarations}}
|
||
|
// expected-error@+1 {{use of '__super' inside a lambda is unsupported}}
|
||
|
auto lambda = []{ __super::foo(); };
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct Base1 {
|
||
|
void foo(int) {}
|
||
|
|
||
|
static void static_foo() {}
|
||
|
|
||
|
typedef int XXX;
|
||
|
};
|
||
|
|
||
|
struct Derived : Base1 {
|
||
|
__super::XXX x;
|
||
|
typedef __super::XXX Type;
|
||
|
|
||
|
enum E {
|
||
|
X = sizeof(__super::XXX)
|
||
|
};
|
||
|
|
||
|
void foo() {
|
||
|
__super::foo(1);
|
||
|
|
||
|
if (true) {
|
||
|
__super::foo(1);
|
||
|
}
|
||
|
|
||
|
return __super::foo(1);
|
||
|
}
|
||
|
|
||
|
static void bar() {
|
||
|
__super::static_foo();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct Outer {
|
||
|
struct Inner : Base1 {
|
||
|
static const int x = sizeof(__super::XXX);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
struct Base2 {
|
||
|
void foo(char) {}
|
||
|
};
|
||
|
|
||
|
struct MemberFunctionInMultipleBases : Base1, Base2 {
|
||
|
void foo() {
|
||
|
__super::foo('x');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct Base3 {
|
||
|
void foo(int) {}
|
||
|
void foo(char) {}
|
||
|
};
|
||
|
|
||
|
struct OverloadedMemberFunction : Base3 {
|
||
|
void foo() {
|
||
|
__super::foo('x');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct PointerToMember : Base1 {
|
||
|
template <void (Base1::*MP)(int)>
|
||
|
struct Wrapper {
|
||
|
static void bar() {}
|
||
|
};
|
||
|
|
||
|
void baz();
|
||
|
};
|
||
|
|
||
|
void PointerToMember::baz() {
|
||
|
Wrapper<&__super::foo>::bar();
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
struct BaseTemplate {
|
||
|
typedef int XXX;
|
||
|
|
||
|
int foo() { return 0; }
|
||
|
};
|
||
|
|
||
|
struct DerivedFromKnownSpecialization : BaseTemplate<int> {
|
||
|
__super::XXX a;
|
||
|
typedef __super::XXX b;
|
||
|
|
||
|
void foo() {
|
||
|
__super::XXX c;
|
||
|
typedef __super::XXX d;
|
||
|
|
||
|
__super::foo();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <typename T>
|
||
|
struct DerivedFromDependentBase : BaseTemplate<T> {
|
||
|
typename __super::XXX a;
|
||
|
typedef typename __super::XXX b;
|
||
|
|
||
|
__super::XXX c; // expected-error {{missing 'typename'}}
|
||
|
typedef __super::XXX d; // expected-error {{missing 'typename'}}
|
||
|
|
||
|
void foo() {
|
||
|
typename __super::XXX e;
|
||
|
typedef typename __super::XXX f;
|
||
|
|
||
|
__super::XXX g; // expected-error {{missing 'typename'}}
|
||
|
typedef __super::XXX h; // expected-error {{missing 'typename'}}
|
||
|
|
||
|
int x = __super::foo();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <typename T>
|
||
|
struct DerivedFromTemplateParameter : T {
|
||
|
typename __super::XXX a;
|
||
|
typedef typename __super::XXX b;
|
||
|
|
||
|
__super::XXX c; // expected-error {{missing 'typename'}}
|
||
|
typedef __super::XXX d; // expected-error {{missing 'typename'}}
|
||
|
|
||
|
void foo() {
|
||
|
typename __super::XXX e;
|
||
|
typedef typename __super::XXX f;
|
||
|
|
||
|
__super::XXX g; // expected-error {{missing 'typename'}}
|
||
|
typedef __super::XXX h; // expected-error {{missing 'typename'}}
|
||
|
|
||
|
__super::foo(1);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void instantiate() {
|
||
|
DerivedFromDependentBase<int> d;
|
||
|
d.foo();
|
||
|
DerivedFromTemplateParameter<Base1> t;
|
||
|
t.foo();
|
||
|
}
|
||
|
|
||
|
namespace {
|
||
|
struct B { int a; };
|
||
|
template <class C>
|
||
|
struct A : B {
|
||
|
// Don't crash on dependent_type_var '->' '__super'
|
||
|
void f() { int a = this->__super::a; }
|
||
|
};
|
||
|
}
|