public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] Avoid complaint warning on mingw
@ 2024-04-15 15:23 Tom Tromey
  0 siblings, 0 replies; only message in thread
From: Tom Tromey @ 2024-04-15 15:23 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=75670e0075df0f6fc8c324ea11de193a038274d6

commit 75670e0075df0f6fc8c324ea11de193a038274d6
Author: Tom Tromey <tromey@adacore.com>
Date:   Tue Apr 9 08:54:58 2024 -0600

    Avoid complaint warning on mingw
    
    The mingw build currently issues a warning:
    
    ./../../src/gdb/utils.h:378:56: warning: ignoring attributes on template argument 'void(const char*, va_list)' {aka 'void(const char*, char*)'} [-Wignored-attributes]
    
    This patch fixes the problem as suggested by Simon:
    
        https://sourceware.org/pipermail/gdb-patches/2024-April/207908.html
    
    ...that is, by changing the warning interceptor to a class with a
    single 'warn' method.
    
    Approved-By: Simon Marchi <simon.marchi@efficios.com>

Diff:
---
 gdb/complaints.c          |  8 ++++----
 gdb/complaints.h          |  6 +++---
 gdb/dwarf2/cooked-index.c |  2 +-
 gdb/utils.c               |  2 +-
 gdb/utils.h               | 38 ++++++++++++++++++--------------------
 5 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/gdb/complaints.c b/gdb/complaints.c
index e375c734884..d3c72df6d41 100644
--- a/gdb/complaints.c
+++ b/gdb/complaints.c
@@ -58,7 +58,7 @@ complaint_internal (const char *fmt, ...)
 
   warning_hook_handler handler = get_warning_hook_handler ();
   if (handler != nullptr)
-    handler (fmt, args);
+    handler->warn (fmt, args);
   else
     {
       gdb_puts (_("During symbol reading: "), gdb_stderr);
@@ -85,7 +85,7 @@ thread_local complaint_interceptor *complaint_interceptor::g_complaint_intercept
 
 complaint_interceptor::complaint_interceptor ()
   : m_saved_complaint_interceptor (&g_complaint_interceptor, this),
-    m_saved_warning_hook (issue_complaint)
+    m_saved_warning_hook (this)
 {
 }
 
@@ -96,7 +96,7 @@ wrap_warning_hook (warning_hook_handler hook, ...)
 {
   va_list args;
   va_start (args, hook);
-  hook ("%s", args);
+  hook->warn ("%s", args);
   va_end (args);
 }
 
@@ -121,7 +121,7 @@ re_emit_complaints (const complaint_collection &complaints)
 /* See complaints.h.  */
 
 void
-complaint_interceptor::issue_complaint (const char *fmt, va_list args)
+complaint_interceptor::warn (const char *fmt, va_list args)
 {
 #if CXX_STD_THREAD
   std::lock_guard<std::mutex> guard (complaint_mutex);
diff --git a/gdb/complaints.h b/gdb/complaints.h
index 8ac4c5034ee..995c35e0ab0 100644
--- a/gdb/complaints.h
+++ b/gdb/complaints.h
@@ -70,7 +70,7 @@ typedef std::unordered_set<std::string> complaint_collection;
    the main thread).  Messages can be re-emitted on the main thread
    using re_emit_complaints, see below.  */
 
-class complaint_interceptor
+class complaint_interceptor final : public warning_hook_handler_type
 {
 public:
 
@@ -94,8 +94,8 @@ private:
 
   /* A helper function that is used by the 'complaint' implementation
      to issue a complaint.  */
-  static void issue_complaint (const char *, va_list)
-    ATTRIBUTE_PRINTF (1, 0);
+  void warn (const char *, va_list) override
+    ATTRIBUTE_PRINTF (2, 0);
 
   /* This object.  Used by the static callback function.  */
   static thread_local complaint_interceptor *g_complaint_interceptor;
diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c
index 66822b575ca..cb0d1f3cd47 100644
--- a/gdb/dwarf2/cooked-index.c
+++ b/gdb/dwarf2/cooked-index.c
@@ -589,7 +589,7 @@ cooked_index_worker::write_to_cache (const cooked_index *idx,
 	 See PR symtab/30837.  This arranges to capture all such
 	 warnings.  This is safe because we know the deferred_warnings
 	 object isn't in use by any other thread at this point.  */
-      scoped_restore_warning_hook defer (*warn);
+      scoped_restore_warning_hook defer (warn);
       m_cache_store.store ();
     }
 }
diff --git a/gdb/utils.c b/gdb/utils.c
index ded03c74099..6a77f6be713 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -164,7 +164,7 @@ void
 vwarning (const char *string, va_list args)
 {
   if (warning_hook != nullptr)
-    warning_hook (string, args);
+    warning_hook->warn (string, args);
   else
     {
       std::optional<target_terminal::scoped_restore_terminal_state> term_state;
diff --git a/gdb/utils.h b/gdb/utils.h
index 875a2583179..96350890a97 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -374,8 +374,19 @@ assign_return_if_changed (T &lval, const T &val)
   return true;
 }
 
-/* A function that can be used to intercept warnings.  */
-typedef gdb::function_view<void (const char *, va_list)> warning_hook_handler;
+/* A class that can be used to intercept warnings.  A class is used
+   here, rather than a gdb::function_view because it proved difficult
+   to use a function view in conjunction with ATTRIBUTE_PRINTF in a
+   way that would satisfy all compilers on all systems.  And, even
+   though gdb only ever uses deferred_warnings here, a virtual
+   function is used to help Insight.  */
+struct warning_hook_handler_type
+{
+  virtual void warn (const char *format, va_list args) ATTRIBUTE_PRINTF (2, 0)
+    = 0;
+};
+
+typedef warning_hook_handler_type *warning_hook_handler;
 
 /* Set the thread-local warning hook, and restore the old value when
    finished.  */
@@ -418,7 +429,7 @@ extern warning_hook_handler get_warning_hook_handler ();
    instance of this class with the 'warn' function, and all warnings can be
    emitted with a single call to 'emit'.  */
 
-struct deferred_warnings
+struct deferred_warnings final : public warning_hook_handler_type
 {
   deferred_warnings ()
     : m_can_style (gdb_stderr->can_emit_style_escape ())
@@ -426,36 +437,23 @@ struct deferred_warnings
   }
 
   /* Add a warning to the list of deferred warnings.  */
-  void warn (const char *format, ...) ATTRIBUTE_PRINTF(2,3)
+  void warn (const char *format, ...) ATTRIBUTE_PRINTF (2, 3)
   {
-    /* Generate the warning text into a string_file.  */
-    string_file msg (m_can_style);
-
     va_list args;
     va_start (args, format);
-    msg.vprintf (format, args);
+    this->warn (format, args);
     va_end (args);
-
-    /* Move the text into the list of deferred warnings.  */
-    m_warnings.emplace_back (std::move (msg));
   }
 
   /* A variant of 'warn' so that this object can be used as a warning
      hook; see scoped_restore_warning_hook.  Note that no locking is
      done, so users have to be careful to only install this into a
      single thread at a time.  */
-  void operator() (const char *format, va_list args)
+  void warn (const char *format, va_list args) override
+    ATTRIBUTE_PRINTF (2, 0)
   {
     string_file msg (m_can_style);
-    /* Clang warns if we add ATTRIBUTE_PRINTF to this method (because
-       the function-view wrapper doesn't also have the attribute), but
-       then warns again if we remove it, because this vprintf call
-       does not use a literal format string.  So, suppress the
-       warnings here.  */
-    DIAGNOSTIC_PUSH
-    DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
     msg.vprintf (format, args);
-    DIAGNOSTIC_POP
     m_warnings.emplace_back (std::move (msg));
   }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-04-15 15:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-15 15:23 [binutils-gdb] Avoid complaint warning on mingw Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).