| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
- struct global {
- };
- namespace PR10127 {
- struct outer {
- struct middle {
- struct inner {
- int func();
- int i;
- };
- struct inner2 {
- };
- struct inner3 {
- };
- int mfunc();
- };
- typedef int td_int;
- };
- struct str {
- operator decltype(outer::middle::inner()) ();
- operator decltype(outer::middle())::inner2 ();
- operator decltype(outer())::middle::inner3 ();
- str(int (decltype(outer::middle::inner())::*n)(),
- int (decltype(outer::middle())::inner::*o)(),
- int (decltype(outer())::middle::inner::*p)());
- };
- decltype(outer::middle::inner()) a;
- void scope() {
- a.decltype(outer::middle())::mfunc(); // expected-error{{'PR10127::outer::middle::mfunc' is not a member of class 'decltype(outer::middle::inner())'}}
- a.decltype(outer::middle::inner())::func();
- a.decltype(outer::middle())::inner::func();
- a.decltype(outer())::middle::inner::func();
- a.decltype(outer())::middle::inner::~inner();
- decltype(outer())::middle::inner().func();
- }
- decltype(outer::middle())::inner b;
- decltype(outer())::middle::inner c;
- decltype(outer())::fail d; // expected-error{{no type named 'fail' in 'PR10127::outer'}}
- decltype(outer())::fail::inner e; // expected-error{{no member named 'fail' in 'PR10127::outer'}}
- decltype()::fail f; // expected-error{{expected expression}}
- decltype()::middle::fail g; // expected-error{{expected expression}}
-
- decltype(int()) h;
- decltype(int())::PR10127::outer i; // expected-error{{'decltype(int())' (aka 'int') is not a class, namespace, or enumeration}}
- decltype(int())::global j; // expected-error{{'decltype(int())' (aka 'int') is not a class, namespace, or enumeration}}
-
- outer::middle k = decltype(outer())::middle();
- outer::middle::inner l = decltype(outer())::middle::inner();
- template<typename T>
- struct templ {
- typename decltype(T())::middle::inner x; // expected-error{{type 'decltype(int())' (aka 'int') cannot be used prior to '::' because it has no members}}
- };
- template class templ<int>; // expected-note{{in instantiation of template class 'PR10127::templ<int>' requested here}}
- template class templ<outer>;
- enum class foo {
- bar,
- baz
- };
-
- foo m = decltype(foo::bar)::baz;
- enum E {
- };
- struct bar {
- enum E : decltype(outer())::td_int(4);
- enum F : decltype(outer())::td_int;
- enum G : decltype; // expected-error{{expected '(' after 'decltype'}}
- };
- }
|