On 11/18/22 13:17, Jonathan Wakely wrote: > On 03/11/22 15:57 -0400, Jason Merrill wrote: >> Tested x86_64-pc-linux-gnu.  OK for trunk? >> >> -- >8 -- >> >> This patch adds the library support for the experimental C++ Contracts >> implementation.  This now consists only of a default definition of the >> violation handler, which users can override through defining their own >> version.  To avoid ABI stability problems with libstdc++.so this is >> added to >> a separate -lstdc++exp static library, which the driver knows to add >> when it >> sees -fcontracts. >> >> libstdc++-v3/ChangeLog: >> >>     * acinclude.m4 (glibcxx_SUBDIRS): Add src/experimental. >>     * include/Makefile.am (experimental_headers): Add contract. >>     * include/Makefile.in: Regenerate. >>     * src/Makefile.am (SUBDIRS): Add experimental. >>     * src/Makefile.in: Regenerate. >>     * configure: Regenerate. >>     * src/experimental/contract.cc: New file. >>     * src/experimental/Makefile.am: New file. >>     * src/experimental/Makefile.in: New file. >>     * include/experimental/contract: New file. >> --- >> libstdc++-v3/src/experimental/contract.cc  |  41 ++ >> libstdc++-v3/acinclude.m4                  |   2 +- >> libstdc++-v3/include/Makefile.am           |   1 + >> libstdc++-v3/include/Makefile.in           |   1 + >> libstdc++-v3/src/Makefile.am               |   3 +- >> libstdc++-v3/src/Makefile.in               |   6 +- >> libstdc++-v3/src/experimental/Makefile.am  |  96 +++ >> libstdc++-v3/src/experimental/Makefile.in  | 796 +++++++++++++++++++++ >> libstdc++-v3/include/experimental/contract |  84 +++ >> 9 files changed, 1026 insertions(+), 4 deletions(-) >> create mode 100644 libstdc++-v3/src/experimental/contract.cc >> create mode 100644 libstdc++-v3/src/experimental/Makefile.am >> create mode 100644 libstdc++-v3/src/experimental/Makefile.in >> create mode 100644 libstdc++-v3/include/experimental/contract >> >> >> base-commit: a4cd2389276a30c39034a83d640ce68fa407bac1 >> prerequisite-patch-id: 329bc16a88dc9a3b13cd3fcecb3678826cc592dc >> >> diff --git a/libstdc++-v3/src/experimental/contract.cc >> b/libstdc++-v3/src/experimental/contract.cc >> new file mode 100644 >> index 00000000000..b9b72cd7df0 >> --- /dev/null >> +++ b/libstdc++-v3/src/experimental/contract.cc >> @@ -0,0 +1,41 @@ >> +// -*- C++ -*- std::experimental::contract_violation and friends >> +// Copyright (C) 1994-2022 Free Software Foundation, Inc. > > Copy&paste from an old file? I don't think this uses anything > existing, should be just 2022. > >> +// >> +// This file is part of GCC. >> +// >> +// GCC is free software; you can redistribute it and/or modify >> +// it under the terms of the GNU General Public License as published by >> +// the Free Software Foundation; either version 3, or (at your option) >> +// any later version. >> +// >> +// GCC is distributed in the hope that it will be useful, >> +// but WITHOUT ANY WARRANTY; without even the implied warranty of >> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the >> +// GNU General Public License for more details. >> +// >> +// Under Section 7 of GPL version 3, you are granted additional >> +// permissions described in the GCC Runtime Library Exception, version >> +// 3.1, as published by the Free Software Foundation. >> + >> +// You should have received a copy of the GNU General Public License and >> +// a copy of the GCC Runtime Library Exception along with this program; >> +// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see >> +// . >> + >> +#include >> +#include >> + >> +__attribute__ ((weak)) void >> +handle_contract_violation (const >> std::experimental::contract_violation &violation) >> +{ >> +  std::cerr << "default std::handle_contract_violation called: " << >> std::endl > > No need for flushing with endl here, just \n please. > >> +    << " " << violation.file_name() >> +    << " " << violation.line_number() >> +    << " " << violation.function_name() >> +    << " " << violation.comment() >> +    << " " << violation.assertion_level() >> +    << " " << violation.assertion_role() >> +    << " " << (int)violation.continuation_mode() >> +    << std::endl; > > And this will flush too, which typically isn't needed for stderr > because it's unbuffered. But somebody could have fiddled with cerr, so > doing this final flush seems OK. > >> +} >> + >> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 >> index 6f672924a73..baf01913a90 100644 >> --- a/libstdc++-v3/acinclude.m4 >> +++ b/libstdc++-v3/acinclude.m4 >> @@ -49,7 +49,7 @@ AC_DEFUN([GLIBCXX_CONFIGURE], [ >>   # Keep these sync'd with the list in Makefile.am.  The first >> provides an >>   # expandable list at autoconf time; the second provides an >> expandable list >>   # (i.e., shell variable) at configure time. >> -  m4_define([glibcxx_SUBDIRS],[include libsupc++ src src/c++98 >> src/c++11 src/c++17 src/c++20 src/filesystem src/libbacktrace doc po >> testsuite python]) >> +  m4_define([glibcxx_SUBDIRS],[include libsupc++ src src/c++98 >> src/c++11 src/c++17 src/c++20 src/filesystem src/libbacktrace >> src/experimental doc po testsuite python]) >>   SUBDIRS='glibcxx_SUBDIRS' >> >>   # These need to be absolute paths, yet at the same time need to >> diff --git a/libstdc++-v3/include/Makefile.am >> b/libstdc++-v3/include/Makefile.am >> index 96137a6621a..a6f9912cb9b 100644 >> --- a/libstdc++-v3/include/Makefile.am >> +++ b/libstdc++-v3/include/Makefile.am >> @@ -769,6 +769,7 @@ experimental_headers = \ >>     ${experimental_srcdir}/array \ >>     ${experimental_srcdir}/buffer \ >>     ${experimental_srcdir}/chrono \ >> +    ${experimental_srcdir}/contract \ >>     ${experimental_srcdir}/deque \ >>     ${experimental_srcdir}/executor \ >>     ${experimental_srcdir}/forward_list \ >> diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am >> index b83c222d51d..6f08068326d 100644 >> --- a/libstdc++-v3/src/Makefile.am >> +++ b/libstdc++-v3/src/Makefile.am >> @@ -37,7 +37,7 @@ backtrace_supported_h = >> endif >> >> ## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE. >> -SUBDIRS = c++98 c++11 c++17 c++20 $(filesystem_dir) $(backtrace_dir) >> +SUBDIRS = c++98 c++11 c++17 c++20 $(filesystem_dir) $(backtrace_dir) >> experimental >> >> # Cross compiler support. >> if VTV_CYGMIN >> @@ -75,6 +75,7 @@ endif >> if ENABLE_BACKTRACE >> vpath % $(top_srcdir)/src/libbacktrace >> endif >> +vpath % $(top_srcdir)/src/experimental >> >> if GLIBCXX_LDBL_COMPAT >> ldbl_compat_sources = compatibility-ldbl.cc >> diff --git a/libstdc++-v3/src/experimental/Makefile.am >> b/libstdc++-v3/src/experimental/Makefile.am >> new file mode 100644 >> index 00000000000..a1c2f62a518 >> --- /dev/null >> +++ b/libstdc++-v3/src/experimental/Makefile.am >> @@ -0,0 +1,96 @@ >> +## Makefile for experimental additions to the GNU C++ Standard library. >> +## >> +## Copyright (C) 2014-2022 Free Software Foundation, Inc. >> +## >> +## Process this file with automake to produce Makefile.in. >> +## >> +## This file is part of GCC. >> +## >> +## GCC is free software; you can redistribute it and/or modify >> +## it under the terms of the GNU General Public License as published by >> +## the Free Software Foundation; either version 3, or (at your option) >> +## any later version. >> +## >> +## GCC is distributed in the hope that it will be useful, >> +## but WITHOUT ANY WARRANTY; without even the implied warranty of >> +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the >> +## GNU General Public License for more details. >> +## >> +## You should have received a copy of the GNU General Public License >> +## along with GCC; see the file COPYING3.  If not see >> +## . >> + >> +include $(top_srcdir)/fragment.am >> + >> +toolexeclib_LTLIBRARIES = libstdc++exp.la >> + >> +headers = >> + >> +sources = \ >> +    contract.cc >> + >> +# vpath % $(top_srcdir)/src/experimental >> + >> +libstdc__exp_la_SOURCES = $(sources) >> + >> +# AM_CXXFLAGS needs to be in each subdirectory so that it can be >> +# modified in a per-library or per-sub-library way.  Need to manually >> +# set this option because CONFIG_CXXFLAGS has to be after >> +# OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden >> +# as the occasion calls for it. >> +AM_CXXFLAGS = \ >> +    -std=gnu++17 -nostdinc++ \ >> +    $(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ >> +    $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ >> +    $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \ >> +    -fimplicit-templates >> + >> +AM_MAKEFLAGS = \ >> +    "gxx_include_dir=$(gxx_include_dir)" >> + >> +# Libtool notes >> + >> +# 1) In general, libtool expects an argument such as `--tag=CXX' when >> +# using the C++ compiler, because that will enable the settings >> +# detected when C++ support was being configured.  However, when no >> +# such flag is given in the command line, libtool attempts to figure >> +# it out by matching the compiler name in each configuration section >> +# against a prefix of the command line.  The problem is that, if the >> +# compiler name and its initial flags stored in the libtool >> +# configuration file don't match those in the command line, libtool >> +# can't decide which configuration to use, and it gives up.  The >> +# correct solution is to add `--tag CXX' to LTCXXCOMPILE and maybe >> +# CXXLINK, just after $(LIBTOOL), so that libtool doesn't have to >> +# attempt to infer which configuration to use. >> +# >> +# The second tag argument, `--tag disable-shared` means that libtool >> +# only compiles each source once, for static objects. In actuality, >> +# glibcxx_lt_pic_flag and glibcxx_compiler_shared_flag are added to >> +# the libtool command that is used create the object, which is >> +# suitable for shared libraries.  The `--tag disable-shared` must be >> +# placed after --tag CXX lest things CXX undo the affect of >> +# disable-shared. >> + >> +# 2) Need to explicitly set LTCXXCOMPILE so that EXTRA_CXX_FLAGS is >> +# last. (That way, things like -O2 passed down from the toplevel can >> +# be overridden by --enable-debug.) >> +LTCXXCOMPILE = \ >> +    $(LIBTOOL) --tag CXX --tag disable-shared \ >> +    $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ >> +    --mode=compile $(CXX) $(TOPLEVEL_INCLUDES) \ >> +    $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) >> $(EXTRA_CXX_FLAGS) >> + >> +LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags >> $(LDFLAGS)) >> + >> +# 3) We'd have a problem when building the shared libstdc++ object if >> +# the rules automake generates would be used.  We cannot allow g++ to >> +# be used since this would add -lstdc++ to the link line which of >> +# course is problematic at this point.  So, we get the top-level >> +# directory to configure libstdc++-v3 to use gcc as the C++ >> +# compilation driver. >> +CXXLINK = \ >> +    $(LIBTOOL) --tag CXX --tag disable-shared \ >> +    $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ >> +    --mode=link $(CXX) \ >> +    $(VTV_CXXLINKFLAGS) \ >> +    $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ >> diff --git a/libstdc++-v3/include/experimental/contract >> b/libstdc++-v3/include/experimental/contract >> new file mode 100644 >> index 00000000000..16f3fd5fd5a >> --- /dev/null >> +++ b/libstdc++-v3/include/experimental/contract >> @@ -0,0 +1,82 @@ >> +// Contracts support header for -*- C++ -*- >> + >> +// Copyright (C) 1995-2022 Free Software Foundation, Inc. > > Just 2022 again (or earlier if this is based on Lock3 code contributed > earilier? but not 1995 I think!) > >> +// This file is part of GCC. >> +// >> +// GCC is free software; you can redistribute it and/or modify >> +// it under the terms of the GNU General Public License as published by >> +// the Free Software Foundation; either version 3, or (at your option) >> +// any later version. >> +// >> +// GCC is distributed in the hope that it will be useful, >> +// but WITHOUT ANY WARRANTY; without even the implied warranty of >> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the >> +// GNU General Public License for more details. >> +// >> +// Under Section 7 of GPL version 3, you are granted additional >> +// permissions described in the GCC Runtime Library Exception, version >> +// 3.1, as published by the Free Software Foundation. >> + >> +// You should have received a copy of the GNU General Public License and >> +// a copy of the GCC Runtime Library Exception along with this program; >> +// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see >> +// . >> + >> +/** @file contract >> + *  This is a Standard C++ Library header. >> + */ >> + >> +#ifndef _GLIBCXX_CONTRACT >> +#define _GLIBCXX_CONTRACT 1 >> + >> +#pragma GCC system_header >> + >> +#if __cplusplus >= 201703L >> + >> +#include > > This is included by so not needed here. > > OK for trunk with those tweaks, thanks. Thanks, this is what I'm pushing: