// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s using nullptr_t = decltype(nullptr); template struct Base { T inner; }; int z; template struct X : Base { static int z; template struct Inner { }; bool f(T other) { // A pair of comparisons; 'inner' is a dependent name so can't be assumed // to be a template. return this->inner < other > ::z; } }; void use_x(X x) { x.f(0); } template struct Y { static int z; template struct Inner : Y { // expected-note {{declared here}} }; bool f(T other) { // We can determine that 'inner' does not exist at parse time, so can // perform typo correction in this case. return this->inner::z; // expected-error {{no template named 'inner' in 'Y'; did you mean 'Inner'?}} } }; struct Q { constexpr operator int() { return 0; } }; void use_y(Y x) { x.f(Q()); }