// RUN: %clang_cc1 -fsyntax-only -std=c++11 -pedantic -verify -fcxx-exceptions %s -fconstexpr-depth 128 -triple i686-pc-linux-gnu

// A conditional-expression is a core constant expression unless it involves one
// of the following as a potentially evaluated subexpression [...]:

// - this (5.1.1 [expr.prim.general]) [Note: when evaluating a constant
//   expression, function invocation substitution (7.1.5 [dcl.constexpr])
//   replaces each occurrence of this in a constexpr member function with a
//   pointer to the class object. -end note];
struct This {
  int this1 : this1; // expected-error {{undeclared}}
  int this2 : this->this1; // expected-error {{invalid}}
  void this3() {
    int n1[this->this1]; // expected-warning {{variable length array}}
    int n2[this1]; // expected-warning {{variable length array}}
    (void)n1, (void)n2;
  }
};

// - an invocation of a function other than a constexpr constructor for a
//   literal class or a constexpr function [ Note: Overload resolution (13.3)
//   is applied as usual - end note ];
struct NonConstexpr1 {
  static int f() { return 1; } // expected-note {{here}}
  int n : f(); // expected-error {{constant expression}} expected-note {{non-constexpr function 'f' cannot be used in a constant expression}}
};
struct NonConstexpr2 {
  constexpr NonConstexpr2(); // expected-note {{here}}
  int n;
};
struct NonConstexpr3 {
  NonConstexpr3();
  int m : NonConstexpr2().n; // expected-error {{constant expression}} expected-note {{undefined constructor 'NonConstexpr2'}}
};
struct NonConstexpr4 {
  NonConstexpr4(); // expected-note {{declared here}}
  int n;
};
struct NonConstexpr5 {
  int n : NonConstexpr4().n; // expected-error {{constant expression}} expected-note {{non-constexpr constructor 'NonConstexpr4' cannot be used in a constant expression}}
};

// - an invocation of an undefined constexpr function or an undefined
//   constexpr constructor;
struct UndefinedConstexpr {
  constexpr UndefinedConstexpr();
  static constexpr int undefinedConstexpr1(); // expected-note {{here}}
  int undefinedConstexpr2 : undefinedConstexpr1(); // expected-error {{constant expression}} expected-note {{undefined function 'undefinedConstexpr1' cannot be used in a constant expression}}
};

// - an invocation of a constexpr function with arguments that, when substituted
//   by function invocation substitution (7.1.5), do not produce a core constant
//   expression;
namespace NonConstExprReturn {
  static constexpr const int &id_ref(const int &n) {
    return n;
  }
  struct NonConstExprFunction {
    int n : id_ref(16); // ok
  };
  constexpr const int *address_of(const int &a) {
    return &a;
  }
  constexpr const int *return_param(int n) { // expected-note {{declared here}}
    return address_of(n);
  }
  struct S {
    int n : *return_param(0); // expected-error {{constant expression}} expected-note {{read of variable whose lifetime has ended}}
  };
}

// - an invocation of a constexpr constructor with arguments that, when
//   substituted by function invocation substitution (7.1.5), do not produce all
//   constant expressions for the constructor calls and full-expressions in the
//   mem-initializers (including conversions);
namespace NonConstExprCtor {
  struct T {
    constexpr T(const int &r) :
      r(r) {
    }
    const int &r;
  };
  constexpr int n = 0;
  constexpr T t1(n); // ok
  constexpr T t2(0); // expected-error {{must be initialized by a constant expression}} expected-note {{temporary created here}} expected-note {{reference to temporary is not a constant expression}}

  struct S {
    int n : T(4).r; // ok
  };
}

// - an invocation of a constexpr function or a constexpr constructor that would
//   exceed the implementation-defined recursion limits (see Annex B);
namespace RecursionLimits {
  constexpr int RecurseForever(int n) {
    return n + RecurseForever(n+1); // expected-note {{constexpr evaluation exceeded maximum depth of 128 calls}} expected-note 9{{in call to 'RecurseForever(}} expected-note {{skipping 118 calls}}
  }
  struct AlsoRecurseForever {
    constexpr AlsoRecurseForever(int n) :
      n(AlsoRecurseForever(n+1).n) // expected-note {{constexpr evaluation exceeded maximum depth of 128 calls}} expected-note 9{{in call to 'AlsoRecurseForever(}} expected-note {{skipping 118 calls}}
    {}
    int n;
  };
  struct S {
    int k : RecurseForever(0); // expected-error {{constant expression}} expected-note {{in call to}}
    int l : AlsoRecurseForever(0).n; // expected-error {{constant expression}} expected-note {{in call to}}
  };
}

// DR1458: taking the address of an object of incomplete class type
namespace IncompleteClassTypeAddr {
  struct S;
  extern S s;
  constexpr S *p = &s; // ok
  static_assert(p, "");

  extern S sArr[];
  constexpr S (*p2)[] = &sArr; // ok

  struct S {
    constexpr S *operator&() const { return nullptr; }
  };
  constexpr S *q = &s; // ok
  static_assert(!q, "");
}

// - an operation that would have undefined behavior [Note: including, for
//   example, signed integer overflow (Clause 5 [expr]), certain pointer
//   arithmetic (5.7 [expr.add]), division by zero (5.6 [expr.mul]), or certain
//   shift operations (5.8 [expr.shift]) -end note];
namespace UndefinedBehavior {
  void f(int n) {
    switch (n) {
    case (int)4.4e9: // expected-error {{constant expression}} expected-note {{value 4.4E+9 is outside the range of representable values of type 'int'}} expected-note {{previous case defined here}}
    case (int)0x80000000u: // ok
    case (int)10000000000ll: // expected-note {{here}}
    case (unsigned int)10000000000ll: // expected-error {{duplicate case value}}
    case (int)(unsigned)(long long)4.4e9: // ok
    case (int)(float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}} expected-error {{duplicate case value '2147483647'}} expected-note {{previous case defined here}}
    case (int)((float)1e37 / 1e30): // ok
    case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type 'half'}} expected-error {{duplicate case value '2147483647'}}
      break;
    }
  }

  constexpr int int_min = ~0x7fffffff;
  constexpr int minus_int_min = -int_min; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}
  constexpr int div0 = 3 / 0; // expected-error {{constant expression}} expected-note {{division by zero}} expected-warning {{undefined}}
  constexpr int mod0 = 3 % 0; // expected-error {{constant expression}} expected-note {{division by zero}} expected-warning {{undefined}}
  constexpr int int_min_div_minus_1 = int_min / -1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}
  constexpr int int_min_mod_minus_1 = int_min % -1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range}}

  constexpr int shl_m1 = 0 << -1; // expected-error {{constant expression}} expected-note {{negative shift count -1}} expected-warning {{negative}}
  constexpr int shl_0 = 0 << 0; // ok
  constexpr int shl_31 = 0 << 31; // ok
  constexpr int shl_32 = 0 << 32; // expected-error {{constant expression}} expected-note {{shift count 32 >= width of type 'int' (32}} expected-warning {{>= width of type}}
  constexpr int shl_unsigned_negative = unsigned(-3) << 1; // ok
  constexpr int shl_unsigned_into_sign = 1u << 31; // ok
  constexpr int shl_unsigned_overflow = 1024u << 31; // ok
  constexpr int shl_signed_negative = (-3) << 1; // expected-error {{constant expression}} expected-note {{left shift of negative value -3}}
  constexpr int shl_signed_ok = 1 << 30; // ok
  constexpr int shl_signed_into_sign = 1 << 31; // ok (DR1457)
  constexpr int shl_signed_into_sign_2 = 0x7fffffff << 1; // ok (DR1457)
  constexpr int shl_signed_off_end = 2 << 31; // expected-error {{constant expression}} expected-note {{signed left shift discards bits}} expected-warning {{signed shift result (0x100000000) requires 34 bits to represent, but 'int' only has 32 bits}}
  constexpr int shl_signed_off_end_2 = 0x7fffffff << 2; // expected-error {{constant expression}} expected-note {{signed left shift discards bits}} expected-warning {{signed shift result (0x1FFFFFFFC) requires 34 bits to represent, but 'int' only has 32 bits}}
  constexpr int shl_signed_overflow = 1024 << 31; // expected-error {{constant expression}} expected-note {{signed left shift discards bits}} expected-warning {{requires 43 bits to represent}}
  constexpr int shl_signed_ok2 = 1024 << 20; // ok

  constexpr int shr_m1 = 0 >> -1; // expected-error {{constant expression}} expected-note {{negative shift count -1}} expected-warning {{negative}}
  constexpr int shr_0 = 0 >> 0; // ok
  constexpr int shr_31 = 0 >> 31; // ok
  constexpr int shr_32 = 0 >> 32; // expected-error {{constant expression}} expected-note {{shift count 32 >= width of type}} expected-warning {{>= width of type}}

  struct S {
    int m;
  };
  constexpr S s = { 5 };
  constexpr const int *p = &s.m + 1;
  constexpr const int &f(const int *q) {
    return q[0];
  }
  constexpr int n = (f(p), 0); // ok
  struct T {
    int n : f(p); // expected-error {{not an integral constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
  };

  namespace Ptr {
    struct A {};
    struct B : A { int n; };
    B a[3][3];
    constexpr B *p = a[0] + 4; // expected-error {{constant expression}} expected-note {{element 4 of array of 3 elements}}
    B b = {};
    constexpr A *pa = &b + 1; // expected-error {{constant expression}} expected-note {{base class of pointer past the end}}
    constexpr B *pb = (B*)((A*)&b + 1); // expected-error {{constant expression}} expected-note {{derived class of pointer past the end}}
    constexpr const int *pn = &(&b + 1)->n; // expected-error {{constant expression}} expected-note {{field of pointer past the end}}
    constexpr B *parr = &a[3][0]; // expected-error {{constant expression}} expected-note {{array element of pointer past the end}}

    constexpr A *na = nullptr;
    constexpr B *nb = nullptr;
    constexpr A &ra = *nb; // expected-error {{constant expression}} expected-note {{cannot access base class of null pointer}}
    constexpr B &rb = (B&)*na; // expected-error {{constant expression}} expected-note {{cannot access derived class of null pointer}}
    static_assert((A*)nb == 0, "");
    static_assert((B*)na == 0, "");
    constexpr const int &nf = nb->n; // expected-error {{constant expression}} expected-note {{cannot access field of null pointer}}
    constexpr const int &np = (*(int(*)[4])nullptr)[2]; // expected-error {{constant expression}} expected-note {{cannot access array element of null pointer}}

    struct C {
      constexpr int f() const { return 0; }
    } constexpr c = C();
    constexpr int k1 = c.f(); // ok
    constexpr int k2 = ((C*)nullptr)->f(); // expected-error {{constant expression}} expected-note {{cannot call member function on null pointer}}
    constexpr int k3 = (&c)[1].f(); // expected-error {{constant expression}} expected-note {{cannot call member function on pointer past the end of object}}
    C c2;
    constexpr int k4 = c2.f(); // ok!

    constexpr int diff1 = &a[2] - &a[0];
    constexpr int diff2 = &a[1][3] - &a[1][0];
    constexpr int diff3 = &a[2][0] - &a[1][0]; // expected-error {{constant expression}} expected-note {{subtracted pointers are not elements of the same array}}
    static_assert(&a[2][0] == &a[1][3], "");
    constexpr int diff4 = (&b + 1) - &b;
    constexpr int diff5 = &a[1][2].n - &a[1][0].n; // expected-error {{constant expression}} expected-note {{subtracted pointers are not elements of the same array}}
    constexpr int diff6 = &a[1][2].n - &a[1][2].n;
    constexpr int diff7 = (A*)&a[0][1] - (A*)&a[0][0]; // expected-error {{constant expression}} expected-note {{subtracted pointers are not elements of the same array}}
  }

  namespace Overflow {
    // Signed int overflow.
    constexpr int n1 = 2 * 3 * 3 * 7 * 11 * 31 * 151 * 331; // ok
    constexpr int n2 = 65536 * 32768; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range of }}
    constexpr int n3 = n1 + 1; // ok
    constexpr int n4 = n3 + 1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range of }}
    constexpr int n5 = -65536 * 32768; // ok
    constexpr int n6 = 3 * -715827883; // expected-error {{constant expression}} expected-note {{value -2147483649 is outside the range of }}
    constexpr int n7 = -n3 + -1; // ok
    constexpr int n8 = -1 + n7; // expected-error {{constant expression}} expected-note {{value -2147483649 is outside the range of }}
    constexpr int n9 = n3 - 0; // ok
    constexpr int n10 = n3 - -1; // expected-error {{constant expression}} expected-note {{value 2147483648 is outside the range of }}
    constexpr int n11 = -1 - n3; // ok
    constexpr int n12 = -2 - n3; // expected-error {{constant expression}} expected-note {{value -2147483649 is outside the range of }}
    constexpr int n13 = n5 + n5; // expected-error {{constant expression}} expected-note {{value -4294967296 is outside the range of }}
    constexpr int n14 = n3 - n5; // expected-error {{constant expression}} expected-note {{value 4294967295 is outside the range of }}
    constexpr int n15 = n5 * n5; // expected-error {{constant expression}} expected-note {{value 4611686018427387904 is outside the range of }}
    constexpr signed char c1 = 100 * 2; // ok
    constexpr signed char c2 = '\x64' * '\2'; // also ok
    constexpr long long ll1 = 0x7fffffffffffffff; // ok
    constexpr long long ll2 = ll1 + 1; // expected-error {{constant}} expected-note {{ 9223372036854775808 }}
    constexpr long long ll3 = -ll1 - 1; // ok
    constexpr long long ll4 = ll3 - 1; // expected-error {{constant}} expected-note {{ -9223372036854775809 }}
    constexpr long long ll5 = ll3 * ll3; // expected-error {{constant}} expected-note {{ 85070591730234615865843651857942052864 }}

    // Yikes.
    char melchizedek[2200000000];
    typedef decltype(melchizedek[1] - melchizedek[0]) ptrdiff_t;
    constexpr ptrdiff_t d1 = &melchizedek[0x7fffffff] - &melchizedek[0]; // ok
    constexpr ptrdiff_t d2 = &melchizedek[0x80000000u] - &melchizedek[0]; // expected-error {{constant expression}} expected-note {{ 2147483648 }}
    constexpr ptrdiff_t d3 = &melchizedek[0] - &melchizedek[0x80000000u]; // ok
    constexpr ptrdiff_t d4 = &melchizedek[0] - &melchizedek[0x80000001u]; // expected-error {{constant expression}} expected-note {{ -2147483649 }}

    // Unsigned int overflow.
    static_assert(65536u * 65536u == 0u, ""); // ok
    static_assert(4294967295u + 1u == 0u, ""); // ok
    static_assert(0u - 1u == 4294967295u, ""); // ok
    static_assert(~0u * ~0u == 1u, ""); // ok

    // Floating-point overflow and NaN.
    constexpr float f1 = 1e38f * 3.4028f; // ok
    constexpr float f2 = 1e38f * 3.4029f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
    constexpr float f3 = 1e38f / -.2939f; // ok
    constexpr float f4 = 1e38f / -.2938f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
    constexpr float f5 = 2e38f + 2e38f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
    constexpr float f6 = -2e38f - 2e38f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces an infinity}}
    constexpr float f7 = 0.f / 0.f; // expected-error {{constant expression}} expected-note {{floating point arithmetic produces a NaN}}
  }
}

// - a lambda-expression (5.1.2);
struct Lambda {
  // FIXME: clang crashes when trying to parse this! Revisit this check once
  // lambdas are fully implemented.
  //int n : []{ return 1; }();
};

// - an lvalue-to-rvalue conversion (4.1) unless it is applied to
namespace LValueToRValue {
  // - a non-volatile glvalue of integral or enumeration type that refers to a
  //   non-volatile const object with a preceding initialization, initialized
  //   with a constant expression  [Note: a string literal (2.14.5 [lex.string])
  //   corresponds to an array of such objects. -end note], or
  volatile const int vi = 1; // expected-note 2{{here}}
  const int ci = 1;
  volatile const int &vrci = ci;
  static_assert(vi, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
  static_assert(const_cast<int&>(vi), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vi'}}
  static_assert(vrci, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}

  // - a non-volatile glvalue of literal type that refers to a non-volatile
  //   object defined with constexpr, or that refers to a sub-object of such an
  //   object, or
  struct V {
    constexpr V() : v(1) {}
    volatile int v; // expected-note {{not literal because}}
  };
  constexpr V v; // expected-error {{non-literal type}}
  struct S {
    constexpr S(int=0) : i(1), v(const_cast<volatile int&>(vi)) {}
    constexpr S(const S &s) : i(2), v(const_cast<volatile int&>(vi)) {}
    int i;
    volatile int &v;
  };
  constexpr S s; // ok
  constexpr volatile S vs; // expected-note {{here}}
  constexpr const volatile S &vrs = s; // ok
  static_assert(s.i, "");
  static_assert(s.v, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
  static_assert(const_cast<int&>(s.v), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vi'}}
  static_assert(vs.i, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}
  static_assert(const_cast<int&>(vs.i), ""); // expected-error {{constant expression}} expected-note {{read of volatile object 'vs'}}
  static_assert(vrs.i, ""); // expected-error {{constant expression}} expected-note {{read of volatile-qualified type}}

  // - a non-volatile glvalue of literal type that refers to a non-volatile
  //   temporary object whose lifetime has not ended, initialized with a
  //   constant expression;
  constexpr volatile S f() { return S(); }
  static_assert(f().i, ""); // ok! there's no lvalue-to-rvalue conversion here!
  static_assert(((volatile const S&&)(S)0).i, ""); // expected-error {{constant expression}}
}

// DR1312: The proposed wording for this defect has issues, so we ignore this
// bullet and instead prohibit casts from pointers to cv void (see core-20842
// and core-20845).
//
// - an lvalue-to-rvalue conversion (4.1 [conv.lval]) that is applied to a
// glvalue of type cv1 T that refers to an object of type cv2 U, where T and U
// are neither the same type nor similar types (4.4 [conv.qual]);

// - an lvalue-to-rvalue conversion (4.1) that is applied to a glvalue that
// refers to a non-active member of a union or a subobject thereof;
namespace LValueToRValueUnion {
  // test/SemaCXX/constant-expression-cxx11.cpp contains more thorough testing
  // of this.
  union U { int a, b; } constexpr u = U();
  static_assert(u.a == 0, "");
  constexpr const int *bp = &u.b;
  constexpr int b = *bp; // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}}

  extern const U pu;
  constexpr const int *pua = &pu.a;
  constexpr const int *pub = &pu.b;
  constexpr U pu = { .b = 1 }; // expected-warning {{C99 feature}}
  constexpr const int a2 = *pua; // expected-error {{constant expression}} expected-note {{read of member 'a' of union with active member 'b'}}
  constexpr const int b2 = *pub; // ok
}

// - an id-expression that refers to a variable or data member of reference type
//   unless the reference has a preceding initialization, initialized with a
//   constant expression;
namespace References {
  const int a = 2;
  int &b = *const_cast<int*>(&a);
  int c = 10; // expected-note 2 {{here}}
  int &d = c;
  constexpr int e = 42;
  int &f = const_cast<int&>(e);
  extern int &g;
  constexpr int &h(); // expected-note {{here}}
  int &i = h(); // expected-note {{here}}
  constexpr int &j() { return b; }
  int &k = j();

  struct S {
    int A : a;
    int B : b;
    int C : c; // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}}
    int D : d; // expected-error {{constant expression}} expected-note {{read of non-const variable 'c'}}
    int D2 : &d - &c + 1;
    int E : e / 2;
    int F : f - 11;
    int G : g; // expected-error {{constant expression}}
    int H : h(); // expected-error {{constant expression}} expected-note {{undefined function 'h'}}
    int I : i; // expected-error {{constant expression}} expected-note {{initializer of 'i' is not a constant expression}}
    int J : j();
    int K : k;
  };
}

// - a dynamic_cast (5.2.7);
namespace DynamicCast {
  struct S { int n; };
  constexpr S s { 16 };
  struct T {
    int n : dynamic_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{dynamic_cast}}
  };
}

// - a reinterpret_cast (5.2.10);
namespace ReinterpretCast {
  struct S { int n; };
  constexpr S s { 16 };
  struct T {
    int n : reinterpret_cast<const S*>(&s)->n; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
  };
  struct U {
    int m : (long)(S*)6; // expected-warning {{constant expression}} expected-note {{reinterpret_cast}}
  };
}

// - a pseudo-destructor call (5.2.4);
namespace PseudoDtor {
  int k;
  typedef int I;
  struct T {
    int n : (k.~I(), 0); // expected-error {{constant expression}}
  };
}

// - increment or decrement operations (5.2.6, 5.3.2);
namespace IncDec {
  int k = 2;
  struct T {
    int n : ++k; // expected-error {{constant expression}}
    int m : --k; // expected-error {{constant expression}}
  };
}

// - a typeid expression (5.2.8) whose operand is of a polymorphic class type;
namespace std {
  struct type_info {
    virtual ~type_info();
    const char *name;
  };
}
namespace TypeId {
  struct S { virtual void f(); };
  constexpr S *p = 0;
  constexpr const std::type_info &ti1 = typeid(*p); // expected-error {{must be initialized by a constant expression}} expected-note {{typeid applied to expression of polymorphic type 'TypeId::S'}}

  struct T {} t;
  constexpr const std::type_info &ti2 = typeid(t);
}

// - a new-expression (5.3.4);
// - a delete-expression (5.3.5);
namespace NewDelete {
  int *p = 0;
  struct T {
    int n : *new int(4); // expected-error {{constant expression}}
    int m : (delete p, 2); // expected-error {{constant expression}}
  };
}

// - a relational (5.9) or equality (5.10) operator where the result is
//   unspecified;
namespace UnspecifiedRelations {
  int a, b;
  constexpr int *p = &a, *q = &b;
  // C++11 [expr.rel]p2: If two pointers p and q of the same type point to
  // different objects that are not members of the same array or to different
  // functions, or if only one of them is null, the results of p<q, p>q, p<=q,
  // and p>=q are unspecified.
  constexpr bool u1 = p < q; // expected-error {{constant expression}}
  constexpr bool u2 = p > q; // expected-error {{constant expression}}
  constexpr bool u3 = p <= q; // expected-error {{constant expression}}
  constexpr bool u4 = p >= q; // expected-error {{constant expression}}
  constexpr bool u5 = p < 0; // expected-error {{constant expression}}
  constexpr bool u6 = p <= 0; // expected-error {{constant expression}}
  constexpr bool u7 = p > 0; // expected-error {{constant expression}}
  constexpr bool u8 = p >= 0; // expected-error {{constant expression}}
  constexpr bool u9 = 0 < q; // expected-error {{constant expression}}
  constexpr bool u10 = 0 <= q; // expected-error {{constant expression}}
  constexpr bool u11 = 0 > q; // expected-error {{constant expression}}
  constexpr bool u12 = 0 >= q; // expected-error {{constant expression}}
  void f(), g();

  constexpr void (*pf)() = &f, (*pg)() = &g;
  constexpr bool u13 = pf < pg; // expected-error {{constant expression}}
  constexpr bool u14 = pf == pg;

  // If two pointers point to non-static data members of the same object with
  // different access control, the result is unspecified.
  struct A {
  public:
    constexpr A() : a(0), b(0) {}
    int a;
    constexpr bool cmp() const { return &a < &b; } // expected-error {{constexpr function never produces a constant expression}} expected-note {{comparison of address of fields 'a' and 'b' of 'A' with differing access specifiers (public vs private) has unspecified value}}
  private:
    int b;
  };
  class B {
  public:
    A a;
    constexpr bool cmp() const { return &a.a < &b.a; } // expected-error {{constexpr function never produces a constant expression}} expected-note {{comparison of address of fields 'a' and 'b' of 'B' with differing access specifiers (public vs protected) has unspecified value}}
  protected:
    A b;
  };

  // If two pointers point to different base sub-objects of the same object, or
  // one points to a base subobject and the other points to a member, the result
  // of the comparison is unspecified. This is not explicitly called out by
  // [expr.rel]p2, but is covered by 'Other pointer comparisons are
  // unspecified'.
  struct C {
    int c[2];
  };
  struct D {
    int d;
  };
  struct E : C, D {
    struct Inner {
      int f;
    } e;
  } e;
  constexpr bool base1 = &e.c[0] < &e.d; // expected-error {{constant expression}} expected-note {{comparison of addresses of subobjects of different base classes has unspecified value}}
  constexpr bool base2 = &e.c[1] < &e.e.f; // expected-error {{constant expression}} expected-note {{comparison of address of base class subobject 'C' of class 'E' to field 'e' has unspecified value}}
  constexpr bool base3 = &e.e.f < &e.d; // expected-error {{constant expression}} expected-note {{comparison of address of base class subobject 'D' of class 'E' to field 'e' has unspecified value}}

  // [expr.rel]p3: Pointers to void can be compared [...] if both pointers
  // represent the same address or are both the null pointer [...]; otherwise
  // the result is unspecified.
  struct S { int a, b; } s;
  constexpr void *null = 0;
  constexpr void *pv = (void*)&s.a;
  constexpr void *qv = (void*)&s.b;
  constexpr bool v1 = null < 0;
  constexpr bool v2 = null < pv; // expected-error {{constant expression}}
  constexpr bool v3 = null == pv; // ok
  constexpr bool v4 = qv == pv; // ok
  constexpr bool v5 = qv >= pv; // expected-error {{constant expression}} expected-note {{unequal pointers to void}}
  constexpr bool v6 = qv > null; // expected-error {{constant expression}}
  constexpr bool v7 = qv <= (void*)&s.b; // ok
  constexpr bool v8 = qv > (void*)&s.a; // expected-error {{constant expression}} expected-note {{unequal pointers to void}}
}

// - an assignment or a compound assignment (5.17); or
namespace Assignment {
  int k;
  struct T {
    int n : (k = 9); // expected-error {{constant expression}}
    int m : (k *= 2); // expected-error {{constant expression}}
  };

  struct Literal {
    constexpr Literal(const char *name) : name(name) {}
    const char *name;
  };
  struct Expr {
    constexpr Expr(Literal l) : IsLiteral(true), l(l) {}
    bool IsLiteral;
    union {
      Literal l;
      // ...
    };
  };
  struct MulEq {
    constexpr MulEq(Expr a, Expr b) : LHS(a), RHS(b) {}
    Expr LHS;
    Expr RHS;
  };
  constexpr MulEq operator*=(Expr a, Expr b) { return MulEq(a, b); }
  Literal a("a");
  Literal b("b");
  MulEq c = a *= b; // ok
}

// - a throw-expression (15.1)
namespace Throw {
  struct S {
    int n : (throw "hello", 10); // expected-error {{constant expression}}
  };
}

// PR9999
template<unsigned int v>
class bitWidthHolding {
public:
  static const
  unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
};

static const int width=bitWidthHolding<255>::width;

template<bool b>
struct always_false {
  static const bool value = false;
};

template<bool b>
struct and_or {
  static const bool and_value = b && and_or<always_false<b>::value>::and_value;
  static const bool or_value = !b || and_or<always_false<b>::value>::or_value;
};

static const bool and_value = and_or<true>::and_value;
static const bool or_value = and_or<true>::or_value;

static_assert(and_value == false, "");
static_assert(or_value == true, "");

namespace rdar13090123 {
  typedef __INTPTR_TYPE__ intptr_t;

  constexpr intptr_t f(intptr_t x) {
    return (((x) >> 21) * 8); // expected-note{{subexpression not valid in a constant expression}}
  }

  extern "C" int foo;

  constexpr intptr_t i = f((intptr_t)&foo - 10); // expected-error{{constexpr variable 'i' must be initialized by a constant expression}} \
  // expected-note{{in call to 'f((char*)&foo + -10)'}}
}
