Blame assert/tst-assert-c++.cc

Packit Service 82fcde
/* Tests for interactions between C++ and assert.
Packit Service 82fcde
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <assert.h>
Packit Service 82fcde
Packit Service 82fcde
/* The C++ standard requires that if the assert argument is a constant
Packit Service 82fcde
   subexpression, then the assert itself is one, too.  */
Packit Service 82fcde
constexpr int
Packit Service 82fcde
check_constexpr ()
Packit Service 82fcde
{
Packit Service 82fcde
  return (assert (true), 1);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Objects of this class can be contextually converted to bool, but
Packit Service 82fcde
   cannot be compared to int.  */
Packit Service 82fcde
struct no_int
Packit Service 82fcde
{
Packit Service 82fcde
  no_int () = default;
Packit Service 82fcde
  no_int (const no_int &) = delete;
Packit Service 82fcde
Packit Service 82fcde
  explicit operator bool () const
Packit Service 82fcde
  {
Packit Service 82fcde
    return true;
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  bool operator! () const; /* No definition.  */
Packit Service 82fcde
  template <class T> bool operator== (T) const; /* No definition.  */
Packit Service 82fcde
  template <class T> bool operator!= (T) const; /* No definition.  */
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* This class tests that operator== is not used by assert.  */
Packit Service 82fcde
struct bool_and_int
Packit Service 82fcde
{
Packit Service 82fcde
  bool_and_int () = default;
Packit Service 82fcde
  bool_and_int (const no_int &) = delete;
Packit Service 82fcde
Packit Service 82fcde
  explicit operator bool () const
Packit Service 82fcde
  {
Packit Service 82fcde
    return true;
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  bool operator! () const; /* No definition.  */
Packit Service 82fcde
  template <class T> bool operator== (T) const; /* No definition.  */
Packit Service 82fcde
  template <class T> bool operator!= (T) const; /* No definition.  */
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test ()
Packit Service 82fcde
{
Packit Service 82fcde
  {
Packit Service 82fcde
    no_int value;
Packit Service 82fcde
    assert (value);
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  {
Packit Service 82fcde
    bool_and_int value;
Packit Service 82fcde
    assert (value);
Packit Service 82fcde
  }
Packit Service 82fcde
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#include <support/test-driver.c>