On 12/22/22 06:03, Arsen Arsenović wrote:
From: Jonathan Wakely <jwak...@redhat.com>

Make the output more readable. Don't output anything unless verbose
termination is enabled at configure-time.

LGTM if Jonathan agrees. The testsuite changes should be applied in the same commit.

libstdc++-v3/ChangeLog:

        PR libstdc++/107792
        PR libstdc++/107778
        * src/experimental/contract.cc (handle_contract_violation): Make
        output more readable.
---
Heh, wouldn't be me if I forgot nothing.  Sorry about that.

How's this?

  libstdc++-v3/src/experimental/contract.cc | 50 ++++++++++++++++++-----
  1 file changed, 39 insertions(+), 11 deletions(-)

diff --git a/libstdc++-v3/src/experimental/contract.cc 
b/libstdc++-v3/src/experimental/contract.cc
index c8d2697eddc..2d41a6326cf 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
  }
-

Reply via email to