diff options
author | Arsen Arsenović <arsen@aarsen.me> | 2022-12-22 12:03:06 +0100 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2022-12-22 19:48:40 -0500 |
commit | 8ec5fcb6fc79e5bcca23c3fecbaf09d4566cb1d5 (patch) | |
tree | 2242d6f9d2afba1d801dd6be7847352202aa9a79 /libstdc++-v3/src/experimental | |
parent | e70380f4545e96bfd1d4ee071fcdd8d46a5ba824 (diff) | |
download | gcc-8ec5fcb6fc79e5bcca23c3fecbaf09d4566cb1d5.zip gcc-8ec5fcb6fc79e5bcca23c3fecbaf09d4566cb1d5.tar.gz gcc-8ec5fcb6fc79e5bcca23c3fecbaf09d4566cb1d5.tar.bz2 |
libstdc++: Improve output of default contract violation handler [PR107792]
Make the output more readable. Don't output anything unless verbose
termination is enabled at configure-time.
The testsuite change was almost entirely mechanical. Save for two files
which had very short matches, these changes were produced by two seds and a
Perl script, for the more involved cases. The latter will be added in a
subsequent commit. The former are as follows:
sed -E -i "/dg-output/s/default std::handle_contract_violation called: \
(\S+) (\S+) (\S+(<[A-Za-z0-9, ]*)?>?)\
/contract violation in function \3 at \1:\2: /" *.C
sed -i '/dg-output/s/ */ /g'
Whichever files remained failing after the above changes were checked-out,
re-ran, with output extracted, and ran through dg-out-generator.pl.
Co-Authored-By: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
PR libstdc++/107792
PR libstdc++/107778
* src/experimental/contract.cc (handle_contract_violation): Make
output more readable.
gcc/testsuite/ChangeLog:
* g++.dg/contracts/contracts-access1.C: Convert to new default
violation handler.
* g++.dg/contracts/contracts-assume2.C: Ditto.
* g++.dg/contracts/contracts-config1.C: Ditto.
* g++.dg/contracts/contracts-constexpr1.C: Ditto.
* g++.dg/contracts/contracts-ctor-dtor1.C: Ditto.
* g++.dg/contracts/contracts-deduced2.C: Ditto.
* g++.dg/contracts/contracts-friend1.C: Ditto.
* g++.dg/contracts/contracts-multiline1.C: Ditto.
* g++.dg/contracts/contracts-post3.C: Ditto.
* g++.dg/contracts/contracts-pre10.C: Ditto.
* g++.dg/contracts/contracts-pre2.C: Ditto.
* g++.dg/contracts/contracts-pre2a2.C: Ditto.
* g++.dg/contracts/contracts-pre3.C: Ditto.
* g++.dg/contracts/contracts-pre4.C: Ditto.
* g++.dg/contracts/contracts-pre5.C: Ditto.
* g++.dg/contracts/contracts-pre7.C: Ditto.
* g++.dg/contracts/contracts-pre9.C: Ditto.
* g++.dg/contracts/contracts-redecl3.C: Ditto.
* g++.dg/contracts/contracts-redecl4.C: Ditto.
* g++.dg/contracts/contracts-redecl6.C: Ditto.
* g++.dg/contracts/contracts-redecl7.C: Ditto.
* g++.dg/contracts/contracts-tmpl-spec1.C: Ditto.
* g++.dg/contracts/contracts-tmpl-spec2.C: Ditto.
* g++.dg/contracts/contracts-tmpl-spec3.C: Ditto.
* g++.dg/contracts/contracts10.C: Ditto.
* g++.dg/contracts/contracts14.C: Ditto.
* g++.dg/contracts/contracts15.C: Ditto.
* g++.dg/contracts/contracts16.C: Ditto.
* g++.dg/contracts/contracts17.C: Ditto.
* g++.dg/contracts/contracts19.C: Ditto.
* g++.dg/contracts/contracts25.C: Ditto.
* g++.dg/contracts/contracts3.C: Ditto.
* g++.dg/contracts/contracts35.C: Ditto.
* g++.dg/contracts/contracts5.C: Ditto.
* g++.dg/contracts/contracts7.C: Ditto.
* g++.dg/contracts/contracts9.C: Ditto.
Diffstat (limited to 'libstdc++-v3/src/experimental')
-rw-r--r-- | libstdc++-v3/src/experimental/contract.cc | 50 |
1 files changed, 39 insertions, 11 deletions
diff --git a/libstdc++-v3/src/experimental/contract.cc b/libstdc++-v3/src/experimental/contract.cc index c8d2697..2d41a63 100644 --- a/libstdc++-v3/src/experimental/contract.cc +++ b/libstdc++-v3/src/experimental/contract.cc @@ -1,4 +1,5 @@ // -*- C++ -*- std::experimental::contract_violation and friends + // Copyright (C) 2019-2022 Free Software Foundation, Inc. // // This file is part of GCC. @@ -23,19 +24,46 @@ // <http://www.gnu.org/licenses/>. #include <experimental/contract> -#include <iostream> +#if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE +# include <iostream> +#endif __attribute__ ((weak)) void handle_contract_violation (const std::experimental::contract_violation &violation) { - std::cerr << "default std::handle_contract_violation called: \n" - << " " << violation.file_name() - << " " << violation.line_number() - << " " << violation.function_name() - << " " << violation.comment() - << " " << violation.assertion_level() - << " " << violation.assertion_role() - << " " << (int)violation.continuation_mode() - << std::endl; -} +#if _GLIBCXX_HOSTED && _GLIBCXX_VERBOSE + bool level_default_p = violation.assertion_level() == "default"; + bool role_default_p = violation.assertion_role() == "default"; + bool cont_mode_default_p = violation.continuation_mode() + == std::experimental::contract_violation_continuation_mode::never_continue; + + const char* modes[]{ "off", "on" }; // Must match enumerators in header. + std::cerr << "contract violation in function " << violation.function_name() + << " at " << violation.file_name() << ':' << violation.line_number() + << ": " << violation.comment(); + + const char* delimiter = "\n["; + if (!level_default_p) + { + std::cerr << delimiter << "level:" << violation.assertion_level(); + delimiter = ", "; + } + if (!role_default_p) + { + std::cerr << delimiter << "role:" << violation.assertion_role(); + delimiter = ", "; + } + if (!cont_mode_default_p) + { + std::cerr << delimiter << "continue:" + << modes[(int)violation.continuation_mode() & 1]; + delimiter = ", "; + } + + if (delimiter[0] == ',') + std::cerr << ']'; + + std::cerr << std::endl; +#endif +} |