blob: 91a2e99c38f4a5b41f65abbf853cf86fc68b5f88 [file] [log] [blame]
// 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 ();