Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr-1.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// Verify the correctness of folding relational expressions involving // pointers to array elements and struct data members and null pointers. // Although the C semantics of relational expressions are only defined // for pointers to objects, C++ makes them well-defined when // (nullptr < p) yields true. See the discussion of the patch for // c++/67376 on gcc-patches for additional background. // { dg-do compile { target c++11 } } // { dg-options "-O1 -fdelete-null-pointer-checks -fdump-tree-optimized" } // Runtime assert. Used for potentially invalid expressions. #define RA(e) ((e) ? (void)0 : __builtin_abort ()) // Static assert. Used for valid core constant expressions. #define SA(e) static_assert ((e), #e) void test_first_array_element () { static constexpr int a[] = { 0 }; constexpr const int *null = 0; constexpr const int *pi = a; // The following are valid constant expressions since in &*pi // the '&*' "cancel each other out." SA (!(null == &*pi)); SA ( (null != &*pi)); // The validity of the relational expressions involving null // pointers in a constexpr context is questionable. Use a run // time assertion to verify these. RA ( (null < &*pi)); RA ( (null <= &*pi)); RA (!(null > &*pi)); RA (!(null >= &*pi)); SA (!(&*pi == null)); SA ( (&*pi != null)); RA (!(&*pi < null)); RA (!(&*pi <= null)); RA ( (&*pi > null)); RA ( (&*pi >= null)); // The following are valid constant expressions since &pi [0] is // equivalent to &*pi. SA (!(null == &pi [0])); SA ( (null != &pi [0])); RA ( (null < &pi [0])); RA ( (null <= &pi [0])); RA (!(null > &pi [0])); RA (!(null >= &pi [0])); SA (!(&pi [0] == null)); SA ( (&pi [0] != null)); RA (!(&pi [0] < null)); RA (!(&pi [0] <= null)); RA ( (&pi [0] > null)); RA ( (&pi [0] >= null)); } void test_first_null_array_element () { constexpr const int *pi = 0; constexpr const int *qi = 0; // The following are valid constant expressions since in &*qi // the '&*' "cancel each other out." SA ( (pi == &*qi)); SA (!(pi != &*qi)); // The validity of the relational expressions involving null // pointers in a constexpr context is questionable. RA (!(pi < &*qi)); RA ( (pi <= &*qi)); RA (!(pi > &*qi)); RA ( (pi >= &*qi)); SA ( (&*qi == pi)); SA (!(&*qi != pi)); RA (!(&*qi < pi)); RA ( (&*qi <= pi)); RA (!(&*qi > pi)); RA ( (&*qi >= pi)); // The following are valid constant expressions since &qi [0] is // equivalent to &*qi. SA ( (pi == &qi [0])); SA (!(pi != &qi [0])); RA (!(pi < &qi [0])); RA ( (pi <= &qi [0])); RA (!(pi > &qi [0])); RA ( (pi >= &qi [0])); SA ( (&qi [0] == pi)); SA (!(&qi [0] != pi)); RA (!(&qi [0] < pi)); RA ( (&qi [0] <= pi)); RA (!(&qi [0] > pi)); RA ( (&qi [0] >= pi)); } void test_first_struct_member () { static struct S { int a, b; } s = { 0, 0 }; constexpr const int *p = 0; constexpr const S *q = &s; SA (!(p == &q->b)); SA ( (p != &q->b)); RA ( (p < &q->b)); RA ( (p <= &q->b)); RA (!(p > &q->b)); RA (!(p >= &q->b)); SA (!(&q->b == p)); SA ( (&q->b != p)); RA (!(&q->b < p)); RA (!(&q->b <= p)); RA ( (&q->b > p)); RA ( (&q->b >= p)); } // Expect all runtime asserts to have been eliminated as a result // of the tested expressions constant folded into true. // { dg-final { scan-assembler-not "abort" } }