49 lines · cpp
1// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s2 3using nullptr_t = decltype(nullptr);4 5template<typename T>6struct Base {7 T inner;8};9 10int z;11 12template<typename T>13struct X : Base<T> {14 static int z;15 16 template<int U>17 struct Inner {18 };19 20 bool f(T other) {21 // A pair of comparisons; 'inner' is a dependent name so can't be assumed22 // to be a template.23 return this->inner < other > ::z; // expected-error {{chained comparison 'X < Y > Z' does not behave the same as a mathematical expression}}24 }25};26 27void use_x(X<int> x) { x.f(0); } // expected-note {{requested here}}28 29template<typename T>30struct Y {31 static int z;32 33 template<int U>34 struct Inner; // expected-note {{declared here}}35 36 bool f(T other) {37 // We can determine that 'inner' does not exist at parse time, so can38 // perform typo correction in this case.39 return this->inner<other>::z; // expected-error {{no template named 'inner' in 'Y<T>'; did you mean 'Inner'?}}40 }41};42 43template<typename T>44template<int U>45struct Y<T>::Inner : Y { };46 47struct Q { constexpr operator int() { return 0; } };48void use_y(Y<Q> x) { x.f(Q()); }49