aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/target/waitstatus.c6
-rw-r--r--gdb/target/waitstatus.h7
-rw-r--r--include/diagnostics.h16
3 files changed, 23 insertions, 6 deletions
diff --git a/gdb/target/waitstatus.c b/gdb/target/waitstatus.c
index a7209e3..0fbcec5 100644
--- a/gdb/target/waitstatus.c
+++ b/gdb/target/waitstatus.c
@@ -30,8 +30,8 @@ target_waitstatus::to_string () const
/* Make sure the compiler warns if a new TARGET_WAITKIND enumerator is added
but not handled here. */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic error "-Wswitch"
+DIAGNOSTIC_PUSH
+DIAGNOSTIC_ERROR_SWITCH
switch (this->kind ())
{
case TARGET_WAITKIND_EXITED:
@@ -63,7 +63,7 @@ target_waitstatus::to_string () const
case TARGET_WAITKIND_THREAD_CREATED:
return str;
}
-#pragma GCC diagnostic pop
+DIAGNOSTIC_POP
gdb_assert_not_reached ("invalid target_waitkind value: %d",
(int) this->kind ());
diff --git a/gdb/target/waitstatus.h b/gdb/target/waitstatus.h
index 48405d2..5b53735 100644
--- a/gdb/target/waitstatus.h
+++ b/gdb/target/waitstatus.h
@@ -20,6 +20,7 @@
#ifndef TARGET_WAITSTATUS_H
#define TARGET_WAITSTATUS_H
+#include "diagnostics.h"
#include "gdbsupport/gdb_signals.h"
/* Stuff for target_wait. */
@@ -108,8 +109,8 @@ target_waitkind_str (target_waitkind kind)
{
/* Make sure the compiler warns if a new TARGET_WAITKIND enumerator is added
but not handled here. */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic error "-Wswitch"
+DIAGNOSTIC_PUSH
+DIAGNOSTIC_ERROR_SWITCH
switch (kind)
{
case TARGET_WAITKIND_EXITED:
@@ -145,7 +146,7 @@ target_waitkind_str (target_waitkind kind)
case TARGET_WAITKIND_THREAD_EXITED:
return "THREAD_EXITED";
};
-#pragma GCC diagnostic pop
+DIAGNOSTIC_POP
gdb_assert_not_reached ("invalid target_waitkind value: %d\n", (int) kind);
}
diff --git a/include/diagnostics.h b/include/diagnostics.h
index f6fd30e..7b3f6db 100644
--- a/include/diagnostics.h
+++ b/include/diagnostics.h
@@ -40,6 +40,8 @@
# define DIAGNOSTIC_IGNORE(option) \
_Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic ignored option))
+# define DIAGNOSTIC_ERROR(option) \
+ _Pragma (DIAGNOSTIC_STRINGIFY (GCC diagnostic error option))
#else
# define DIAGNOSTIC_PUSH
# define DIAGNOSTIC_POP
@@ -61,6 +63,9 @@
# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \
DIAGNOSTIC_IGNORE ("-Wformat-nonliteral")
+# define DIAGNOSTIC_ERROR_SWITCH \
+ DIAGNOSTIC_ERROR ("-Wswitch")
+
#elif defined (__GNUC__) /* GCC */
# if __GNUC__ >= 7
@@ -74,6 +79,13 @@
# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL \
DIAGNOSTIC_IGNORE ("-Wformat-nonliteral")
+/* GCC 4.8's "diagnostic push/pop" seems broken when using this, -Wswitch
+ remains enabled at the error level even after a pop. Therefore, don't
+ use it for GCC < 5. */
+# if __GNUC__ >= 5
+# define DIAGNOSTIC_ERROR_SWITCH DIAGNOSTIC_ERROR ("-Wswitch")
+# endif
+
#endif
#ifndef DIAGNOSTIC_IGNORE_SELF_MOVE
@@ -100,4 +112,8 @@
# define DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
#endif
+#ifndef DIAGNOSTIC_ERROR_SWITCH
+# define DIAGNOSTIC_ERROR_SWITCH
+#endif
+
#endif /* DIAGNOSTICS_H */