(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
cpp1y/
constexpr-89074-3.C
// PR c++/89074
// { dg-do compile { target c++14 } }

int fn1 (void) { return 0; }
int fn2 (void) { return 1; }

constexpr bool
f1 ()
{
  char a[] = { 1, 2, 3, 4 };

  if (&a[1] == "foo")
    return false;

  if (&a[1] == &"foo"[4])
    return false;

  if (&"foo"[1] == &a[0])
    return false;

  if (&"foo"[3] == &a[4])
    return false;

  if (&a[0] == "foo")
    return false;

  // Pointer to start of one object (var) and end of another one (literal)
  if (&a[0] == &"foo"[4])	// { dg-error "is not a constant expression" }
    return false;

  return true;
}

constexpr bool
f2 ()
{
  char a[] = { 1, 2, 3, 4 };

  // Pointer to end of one object (var) and start of another one (literal)
  if (&a[4] == "foo")		// { dg-error "is not a constant expression" }
    return false;

  return true;
}

char v[] = { 1, 2, 3, 4 };

constexpr bool
f3 ()
{
  char a[] = { 1, 2, 3, 4 };

  if (&a[1] == &v[1])
    return false;

  if (&a[0] == &v[3])
    return false;

  if (&a[2] == &v[4])
    return false;

  // Pointer to start of one object (automatic var) and end of another one (non-automagic var)
  if (&a[0] == &v[4])		// { dg-error "is not a constant expression" }
    return false;

  return true;
}

constexpr bool
f4 ()
{
  char a[] = { 1, 2, 3, 4, 5 };

  // Pointer to end of one object (automatic var) and start of another one (non-automagic var)
  if (&a[5] == &v[0])		// { dg-error "is not a constant expression" }
    return false;

  return true;
}

constexpr bool
f5 ()
{
  if (fn1 != fn1)
    return false;

  if (fn1 == fn2)
    return false;

  if (&"abcde"[0] == &"edcba"[1])
    return false;

  if (&"abcde"[1] == &"edcba"[6])
    return false;

  // Pointer to start of one object (literal) and end of another one (literal)
  if (&"abcde"[0] == &"edcba"[6])	// { dg-error "is not a constant expression" }
    return false;

  return true;
}

constexpr bool
f6 ()
{
  // Pointer to start of one object (literal) and end of another one (literal)
  if (&"abcde"[6] == &"edcba"[0])	// { dg-error "is not a constant expression" }
    return false;

  return true;
}

constexpr bool
f7 ()
{
  if (&"abcde"[3] == &"fabcde"[3])
    return false;

  // These could be suffix merged, with &"abcde"[0] == &"fabcde"[1].
  if (&"abcde"[3] == &"fabcde"[4])	// { dg-error "is not a constant expression" }
    return false;

  return true;
}

constexpr bool a = f1 ();
constexpr bool b = f2 ();
constexpr bool c = f3 ();
constexpr bool d = f4 ();
constexpr bool e = f5 ();
constexpr bool f = f6 ();
constexpr bool g = f7 ();