brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · c3c8755 Raw
126 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++2a2// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++2a -fexperimental-new-constant-interpreter3 4int foo(int x) {5  return x == x; // expected-warning {{self-comparison always evaluates to true}}6}7 8struct X {9  bool operator==(const X &x) const;10};11 12struct A {13  int x;14  X x2;15  int a[3];16  int b[3];17  bool f() { return x == x; } // expected-warning {{self-comparison always evaluates to true}}18  bool g() { return x2 == x2; } // no-warning19  bool h() { return a == b; } // expected-warning {{array comparison always evaluates to false}} expected-warning {{deprecated}}20  bool i() {21    int c[3];22    return a == c; // expected-warning {{array comparison always evaluates to false}} expected-warning {{deprecated}}23  }24};25 26namespace NA { extern "C" int x[3]; }27namespace NB { extern "C" int x[3]; }28bool k = NA::x == NB::x; // expected-warning {{self-comparison always evaluates to true}} expected-warning {{deprecated}}29 30template<typename T> struct Y { static inline int n; };31bool f() {32  return33    Y<int>::n == Y<int>::n || // expected-warning {{self-comparison always evaluates to true}}34    Y<void>::n == Y<int>::n;35}36template<typename T, typename U>37bool g() {38  // FIXME: Ideally we'd produce a self-comparison warning on the first of these.39  return40    Y<T>::n == Y<T>::n ||41    Y<T>::n == Y<U>::n;42}43template bool g<int, int>(); // should not produce any warnings44 45namespace member_tests {46struct B {47  int field;48  static int static_field;49  int test(B b) {50    return field == field;  // expected-warning {{self-comparison always evaluates to true}}51    return static_field == static_field;  // expected-warning {{self-comparison always evaluates to true}}52    return static_field == b.static_field;  // expected-warning {{self-comparison always evaluates to true}}53    return B::static_field == this->static_field;  // expected-warning {{self-comparison always evaluates to true}}54    return this == this;  // expected-warning {{self-comparison always evaluates to true}}55 56    return field == b.field;57    return this->field == b.field;58  }59};60 61enum {62  I0,63  I1,64  I2,65};66 67struct S {68  int field;69  static int static_field;70  int array[4];71};72 73struct T {74  int field;75  static int static_field;76  int array[4];77  S s;78};79 80int struct_test(S s1, S s2, S *s3, T t) {81  return s1.field == s1.field;  // expected-warning {{self-comparison always evaluates to true}}82  return s2.field == s2.field;  // expected-warning {{self-comparison always evaluates to true}}83  return s1.static_field == s2.static_field;  // expected-warning {{self-comparison always evaluates to true}}84  return S::static_field == s1.static_field;  // expected-warning {{self-comparison always evaluates to true}}85  return s1.array == s1.array;  // expected-warning {{self-comparison always evaluates to true}} expected-warning {{deprecated}}86  return t.s.static_field == S::static_field;  // expected-warning {{self-comparison always evaluates to true}}87  return s3->field == s3->field;  // expected-warning {{self-comparison always evaluates to true}}88  return s3->static_field == S::static_field;  // expected-warning {{self-comparison always evaluates to true}}89  return s1.array[0] == s1.array[0];  // expected-warning {{self-comparison always evaluates to true}}90  return s1.array[0] == s1.array[0ull];  // expected-warning {{self-comparison always evaluates to true}}91  return s1.array[I1] == s1.array[I1];  // expected-warning {{self-comparison always evaluates to true}}92  return s1.array[s2.array[0]] == s1.array[s2.array[0]];  // expected-warning {{self-comparison always evaluates to true}}93  return s3->array[t.field] == s3->array[t.field];  // expected-warning {{self-comparison always evaluates to true}}94 95  // Try all operators96  return t.field == t.field;  // expected-warning {{self-comparison always evaluates to true}}97  return t.field <= t.field;  // expected-warning {{self-comparison always evaluates to true}}98  return t.field >= t.field;  // expected-warning {{self-comparison always evaluates to true}}99 100  return t.field != t.field;  // expected-warning {{self-comparison always evaluates to false}}101  return t.field < t.field;  // expected-warning {{self-comparison always evaluates to false}}102  return t.field > t.field;  // expected-warning {{self-comparison always evaluates to false}}103 104  // no warning105  return s1.field == s2.field;106  return s2.array == s1.array; // FIXME: This always evaluates to false. expected-warning {{deprecated}}107  return s2.array[0] == s1.array[0];108  return s1.array[I1] == s1.array[I2];109 110  return s1.static_field == t.static_field;111};112 113struct U {114  bool operator!=(const U&);115};116 117bool operator==(const U&, const U&);118 119// May want to warn on this in the future.120int user_defined(U u) {121  return u == u;122  return u != u;123}124 125} // namespace member_tests126