// 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'}} }; }