brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.1 KiB · 5f518f2 Raw
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