// Force x86-64 because some of our heuristics are actually based
// on integer sizes.

// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -Wtautological-constant-in-range-compare -std=c++11 %s
// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -Wtype-limits -std=c++11 %s

int test0(long a, unsigned long b) {
  enum EnumA {A};
  enum EnumB {B};
  enum EnumC {C = 0x10000};
  return
         // (a,b)
         (a == (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
         (a == (unsigned int) b) +
         (a == (unsigned short) b) +
         (a == (unsigned char) b) +
         ((long) a == b) +  // expected-warning {{comparison of integers of different signs}}
         ((int) a == b) +  // expected-warning {{comparison of integers of different signs}}
         ((short) a == b) +  // expected-warning {{comparison of integers of different signs}}
         ((signed char) a == b) +  // expected-warning {{comparison of integers of different signs}}
         ((long) a == (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
         ((int) a == (unsigned int) b) +  // expected-warning {{comparison of integers of different signs}}
         ((short) a == (unsigned short) b) +
         ((signed char) a == (unsigned char) b) +
         (a < (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
         (a < (unsigned int) b) +
         (a < (unsigned short) b) +
         (a < (unsigned char) b) +
         ((long) a < b) +  // expected-warning {{comparison of integers of different signs}}
         ((int) a < b) +  // expected-warning {{comparison of integers of different signs}}
         ((short) a < b) +  // expected-warning {{comparison of integers of different signs}}
         ((signed char) a < b) +  // expected-warning {{comparison of integers of different signs}}
         ((long) a < (unsigned long) b) +  // expected-warning {{comparison of integers of different signs}}
         ((int) a < (unsigned int) b) +  // expected-warning {{comparison of integers of different signs}}
         ((short) a < (unsigned short) b) +
         ((signed char) a < (unsigned char) b) +

         // (A,b)
         (A == (unsigned long) b) +
         (A == (unsigned int) b) +
         (A == (unsigned short) b) +
         (A == (unsigned char) b) +
         ((long) A == b) +
         ((int) A == b) +
         ((short) A == b) +
         ((signed char) A == b) +
         ((long) A == (unsigned long) b) +
         ((int) A == (unsigned int) b) +
         ((short) A == (unsigned short) b) +
         ((signed char) A == (unsigned char) b) +
         (A < (unsigned long) b) +
         (A < (unsigned int) b) +
         (A < (unsigned short) b) +
         (A < (unsigned char) b) +
         ((long) A < b) +
         ((int) A < b) +
         ((short) A < b) +
         ((signed char) A < b) +
         ((long) A < (unsigned long) b) +
         ((int) A < (unsigned int) b) +
         ((short) A < (unsigned short) b) +
         ((signed char) A < (unsigned char) b) +

         // (a,B)
         (a == (unsigned long) B) +
         (a == (unsigned int) B) +
         (a == (unsigned short) B) +
         (a == (unsigned char) B) +
         ((long) a == B) +
         ((int) a == B) +
         ((short) a == B) +
         ((signed char) a == B) +
         ((long) a == (unsigned long) B) +
         ((int) a == (unsigned int) B) +
         ((short) a == (unsigned short) B) +
         ((signed char) a == (unsigned char) B) +
         (a < (unsigned long) B) +  // expected-warning {{comparison of unsigned expression < 0 is always false}}
         (a < (unsigned int) B) +
         (a < (unsigned short) B) +
         (a < (unsigned char) B) +
         ((long) a < B) +
         ((int) a < B) +
         ((short) a < B) +
         ((signed char) a < B) +
         ((long) a < (unsigned long) B) +  // expected-warning {{comparison of unsigned expression < 0 is always false}}
         ((int) a < (unsigned int) B) +  // expected-warning {{comparison of unsigned expression < 0 is always false}}
         ((short) a < (unsigned short) B) +
         ((signed char) a < (unsigned char) B) +

         // (C,b)
         (C == (unsigned long) b) +
         (C == (unsigned int) b) +
         (C == (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
         (C == (unsigned char) b) +  // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
         ((long) C == b) +
         ((int) C == b) +
         ((short) C == b) +
         ((signed char) C == b) +
         ((long) C == (unsigned long) b) +
         ((int) C == (unsigned int) b) +
         ((short) C == (unsigned short) b) +
         ((signed char) C == (unsigned char) b) +
         (C < (unsigned long) b) +
         (C < (unsigned int) b) +
         (C < (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
         (C < (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
         ((long) C < b) +
         ((int) C < b) +
         ((short) C < b) +
         ((signed char) C < b) +
         ((long) C < (unsigned long) b) +
         ((int) C < (unsigned int) b) +
         ((short) C < (unsigned short) b) +
         ((signed char) C < (unsigned char) b) +

         // (a,C)
         (a == (unsigned long) C) +
         (a == (unsigned int) C) +
         (a == (unsigned short) C) +
         (a == (unsigned char) C) +
         ((long) a == C) +
         ((int) a == C) +
         ((short) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always false}}
         ((signed char) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always false}}
         ((long) a == (unsigned long) C) +
         ((int) a == (unsigned int) C) +
         ((short) a == (unsigned short) C) +
         ((signed char) a == (unsigned char) C) +
         (a < (unsigned long) C) +  // expected-warning {{comparison of integers of different signs}}
         (a < (unsigned int) C) +
         (a < (unsigned short) C) +
         (a < (unsigned char) C) +
         ((long) a < C) +
         ((int) a < C) +
         ((short) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always true}}
         ((signed char) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always true}}
         ((long) a < (unsigned long) C) +  // expected-warning {{comparison of integers of different signs}}
         ((int) a < (unsigned int) C) +  // expected-warning {{comparison of integers of different signs}}
         ((short) a < (unsigned short) C) +
         ((signed char) a < (unsigned char) C) +

         // (0x80000,b)
         (0x80000 == (unsigned long) b) +
         (0x80000 == (unsigned int) b) +
         (0x80000 == (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}}
         (0x80000 == (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}}
         ((long) 0x80000 == b) +
         ((int) 0x80000 == b) +
         ((short) 0x80000 == b) +
         ((signed char) 0x80000 == b) +
         ((long) 0x80000 == (unsigned long) b) +
         ((int) 0x80000 == (unsigned int) b) +
         ((short) 0x80000 == (unsigned short) b) +
         ((signed char) 0x80000 == (unsigned char) b) +
         (0x80000 < (unsigned long) b) +
         (0x80000 < (unsigned int) b) +
         (0x80000 < (unsigned short) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned short' is always false}}
         (0x80000 < (unsigned char) b) + // expected-warning {{comparison of constant 524288 with expression of type 'unsigned char' is always false}}
         ((long) 0x80000 < b) +
         ((int) 0x80000 < b) +
         ((short) 0x80000 < b) +
         ((signed char) 0x80000 < b) +
         ((long) 0x80000 < (unsigned long) b) +
         ((int) 0x80000 < (unsigned int) b) +
         ((short) 0x80000 < (unsigned short) b) +
         ((signed char) 0x80000 < (unsigned char) b) +

         // (a,0x80000)
         (a == (unsigned long) 0x80000) +
         (a == (unsigned int) 0x80000) +
         (a == (unsigned short) 0x80000) +
         (a == (unsigned char) 0x80000) +
         ((long) a == 0x80000) +
         ((int) a == 0x80000) +
         ((short) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always false}}
         ((signed char) a == 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always false}}
         ((long) a == (unsigned long) 0x80000) +
         ((int) a == (unsigned int) 0x80000) +
         ((short) a == (unsigned short) 0x80000) +
         ((signed char) a == (unsigned char) 0x80000) +
         (a < (unsigned long) 0x80000) +  // expected-warning {{comparison of integers of different signs}}
         (a < (unsigned int) 0x80000) +
         (a < (unsigned short) 0x80000) +
         (a < (unsigned char) 0x80000) +
         ((long) a < 0x80000) +
         ((int) a < 0x80000) +
         ((short) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'short' is always true}}
         ((signed char) a < 0x80000) + // expected-warning {{comparison of constant 524288 with expression of type 'signed char' is always true}}
         ((long) a < (unsigned long) 0x80000) +  // expected-warning {{comparison of integers of different signs}}
         ((int) a < (unsigned int) 0x80000) +  // expected-warning {{comparison of integers of different signs}}
         ((short) a < (unsigned short) 0x80000) +
         ((signed char) a < (unsigned char) 0x80000) +

         10
    ;
}

int test1(int i) {
  enum en { zero };
  return i > zero;
}

enum E { e };
void test2(int i, void *vp) {
  if (&i == vp) { } // ok
  if (test1 == vp) { } // expected-warning{{equality comparison between function pointer and void pointer}}
  if (test1 == e) { } // expected-error{{comparison between pointer and integer}}
  if (vp < 0) { } // expected-error {{comparison between pointer and zero}}
  if (test1 < e) { } // expected-error{{comparison between pointer and integer}}
}

// PR7536
static const unsigned int kMax = 0;
int pr7536() {
  return (kMax > 0);
}

// -Wsign-compare should not warn when ?: operands have different signedness.
// This will be caught by -Wsign-conversion
void test3() {
  unsigned long a;
  signed long b;
  (void) (true ? a : b);
  (void) (true ? (unsigned int)a : (signed int)b);
  (void) (true ? b : a);
  (void) (true ? (unsigned char)b : (signed char)a);
}

// Test comparison of short to unsigned.  If tautological compare does not
// trigger, then the signed comparison warning will.
void test4(short s) {
  // A is max short plus 1.  All zero and positive shorts are smaller than it.
  // All negative shorts are cast towards the max unsigned range.  Relation
  // comparisons are possible, but equality comparisons are tautological.
  const unsigned A = 32768;
  void (s < A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
  void (s > A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
  void (s <= A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
  void (s >= A); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}

  void (s == A); // expected-warning{{comparison of constant 32768 with expression of type 'short' is always false}}
  void (s != A); // expected-warning{{comparison of constant 32768 with expression of type 'short' is always true}}

  // When negative one is converted to an unsigned value, it becomes the max
  // unsigned.  Likewise, a negative one short can also be converted to max
  // unsigned.
  const unsigned B = -1;
  void (s < B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
  void (s > B); // expected-warning{{comparison 'short' > 4294967295 is always false}}
  void (s <= B); // expected-warning{{comparison 'short' <= 4294967295 is always true}}
  void (s >= B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
  void (s == B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}
  void (s != B); // expected-warning{{comparison of integers of different signs: 'short' and 'const unsigned int'}}

}

void test5(bool b) {
  (void) (b < -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always false}}
  (void) (b > -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always true}}
  (void) (b == -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always false}}
  (void) (b != -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always true}}
  (void) (b <= -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always false}}
  (void) (b >= -1); // expected-warning{{comparison of constant -1 with expression of type 'bool' is always true}}

  (void) (b < -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always false}}
  (void) (b > -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always true}}
  (void) (b == -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always false}}
  (void) (b != -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always true}}
  (void) (b <= -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always false}}
  (void) (b >= -10); // expected-warning{{comparison of constant -10 with expression of type 'bool' is always true}}

  (void) (b < 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always true}}
  (void) (b > 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always false}}
  (void) (b == 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always false}}
  (void) (b != 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always true}}
  (void) (b <= 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always true}}
  (void) (b >= 2); // expected-warning{{comparison of constant 2 with expression of type 'bool' is always false}}

  (void) (b < 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always true}}
  (void) (b > 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always false}}
  (void) (b == 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always false}}
  (void) (b != 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always true}}
  (void) (b <= 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always true}}
  (void) (b >= 10); // expected-warning{{comparison of constant 10 with expression of type 'bool' is always false}}
}

void test6(signed char sc) {
  (void)(sc < 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
  (void)(sc > 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
  (void)(sc <= 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
  (void)(sc >= 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
  (void)(sc == 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
  (void)(sc != 200); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}

  (void)(200 < sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
  (void)(200 > sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
  (void)(200 <= sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
  (void)(200 >= sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
  (void)(200 == sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always false}}
  (void)(200 != sc); // expected-warning{{comparison of constant 200 with expression of type 'signed char' is always true}}
}

// Test many signedness combinations.
void test7(unsigned long other) {
  // Common unsigned, other unsigned, constant unsigned
  (void)((unsigned)other != (unsigned long)(0x1ffffffff)); // expected-warning{{true}}
  (void)((unsigned)other != (unsigned long)(0xffffffff));
  (void)((unsigned long)other != (unsigned)(0x1ffffffff));
  (void)((unsigned long)other != (unsigned)(0xffffffff));

  // Common unsigned, other signed, constant unsigned
  (void)((int)other != (unsigned long)(0xffffffffffffffff)); // expected-warning{{different signs}}
  (void)((int)other != (unsigned long)(0x00000000ffffffff)); // expected-warning{{true}}
  (void)((int)other != (unsigned long)(0x000000000fffffff));
  (void)((int)other < (unsigned long)(0x00000000ffffffff));  // expected-warning{{different signs}}
  (void)((int)other == (unsigned)(0x800000000));

  // Common unsigned, other unsigned, constant signed
  (void)((unsigned long)other != (int)(0xffffffff));  // expected-warning{{different signs}}

  // Common unsigned, other signed, constant signed
  // Should not be possible as the common type should also be signed.

  // Common signed, other signed, constant signed
  (void)((int)other != (long)(0xffffffff));  // expected-warning{{true}}
  (void)((int)other != (long)(0xffffffff00000000));  // expected-warning{{true}}
  (void)((int)other != (long)(0xfffffff));
  (void)((int)other != (long)(0xfffffffff0000000));

  // Common signed, other signed, constant unsigned
  (void)((int)other != (unsigned char)(0xffff));
  (void)((int)other != (unsigned char)(0xff));

  // Common signed, other unsigned, constant signed
  (void)((unsigned char)other != (int)(0xff));
  (void)((unsigned char)other != (int)(0xffff));  // expected-warning{{true}}

  // Common signed, other unsigned, constant unsigned
  (void)((unsigned char)other != (unsigned short)(0xff));
  (void)((unsigned char)other != (unsigned short)(0x100)); // expected-warning{{true}}
  (void)((unsigned short)other != (unsigned char)(0xff));
}

void test8(int x) {
  enum E {
    Negative = -1,
    Positive = 1
  };

  (void)((E)x == 1);
  (void)((E)x == -1);
}

void test9(int x) {
  enum E : int {
    Positive = 1
  };
  (void)((E)x == 1);
}

namespace templates {
  template<class T> T max();

  template<> constexpr int max<int>() { return 2147483647; };

  template<typename T>
  bool less_than_max(short num, T value) {
    const T vmax = max<T>();
    return (vmax >= num);  // no warning
  }

  template<typename T>
  bool less_than_max(short num) {
    // This should trigger one warning on the template pattern, and not a
    // warning per specialization.
    return num < max<int>();  // expected-warning{{comparison of constant 2147483647 with expression of type 'short' is always true}}
  }

  void test10(short num, int x) {
    less_than_max(num, x);
    less_than_max<int>(num);
    less_than_max<long>(num);
    less_than_max<short>(num);
  }

  template<typename T>
  inline bool less_than_zero(T num, T value) {
    return num < 0;  // no warning
  }

  template<typename T>
  inline bool less_than_zero(unsigned num) {
    // This should trigger one warning on the template pattern, and not a
    // warning per specialization.
    return num < 0;  // expected-warning{{comparison of unsigned expression < 0 is always false}}
  }

  void test11(unsigned num) {
    less_than_zero(num, num);
    less_than_zero<int>(num);
    less_than_zero<long>(num);
    less_than_zero<short>(num);
  }

  template<unsigned n> bool compare(unsigned k) { return k >= n; }

  void test12() {
    compare<0>(42);
  }

  struct A { static int x; };
  struct B { static int x; };
  typedef A otherA;

  template <typename T>
  void testx() {
    if (A::x == T::x &&  // no warning
        A::x == otherA::x)  // expected-warning{{self-comparison always evaluates to true}}
      return;
  }

  void test13() {
    testx<A>();
    testx<B>();
  }
}

namespace tautological_enum {
  enum E { a, b, c } e;

  // FIXME: We should warn about constructing this out-of-range numeration value.
  const E invalid = (E)-1;
  // ... but we should not warn about comparing against it.
  bool x = e == invalid;

  // We should not warn about relational comparisons for enumerators, even if
  // they're tautological.
  bool y = e >= a && e <= b;
  const E first_in_range = a;
  const E last_in_range = b;
  bool z = e >= first_in_range && e <= last_in_range;
}
