This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
GCC_DIAG_IGNORE/RESTORE whine in non-gcc if at file level.
authorJarkko Hietaniemi <jhi@iki.fi>
Fri, 20 Jun 2014 02:03:25 +0000 (22:03 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Fri, 20 Jun 2014 11:09:12 +0000 (07:09 -0400)
inline.h
perl.h

index 87c2ac4..8b74452 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -188,13 +188,17 @@ S_sv_or_pv_pos_u2b(pTHX_ SV *sv, const char *pv, STRLEN pos, STRLEN *lenp)
 /* ------------------------------- handy.h ------------------------------- */
 
 /* saves machine code for a common noreturn idiom typically used in Newx*() */
+#ifdef GCC_DIAG_PRAGMA
 GCC_DIAG_IGNORE(-Wunused-function);
+#endif
 static void
 S_croak_memory_wrap(void)
 {
     Perl_croak_nocontext("%s",PL_memory_wrap);
 }
+#ifdef GCC_DIAG_PRAGMA
 GCC_DIAG_RESTORE;
+#endif
 
 /* ------------------------------- utf8.h ------------------------------- */
 
diff --git a/perl.h b/perl.h
index 690ecff..58dd2c1 100644 (file)
--- a/perl.h
+++ b/perl.h
  *
  * Note that "pragma GCC diagnostic push/pop" was added in GCC 4.6, Mar 2011;
  * clang only pretends to be GCC 4.2, but still supports push/pop.
+ *
+ * Note on usage: on non-gcc (or lookalike, like clang) compilers
+ * one cannot use these at file (global) level without warnings
+ * since they are defined as empty, which leads into the terminating
+ * semicolon being left alone on a line:
+ * ;
+ * which makes compilers mildly cranky.  Therefore at file level one
+ * should use the #ifdef GCC_DIAG_PRAGMA guard around the GCC_DIAG_IGNORE
+ * and GCC_DIAG_RESTORE.
+ *
+ * (An alternative solution would be not to use the semicolon, and then
+ * the empty definition would be just empty, but that would make the code
+ * look odd, and might mess up e.g. smart editors indenting the code.)
+ *
+ * (A dead-on-arrival solution would be to try to define the macros as
+ * NOOP or dNOOP, those don't work both inside functions and outside.)
  */
 
 #if defined(__clang__) || defined(__clang) || \
        (defined( __GNUC__) && ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406)
-#  define GCC_DIAG_DO_PRAGMA_(x) _Pragma (#x)
-
+#  define GCC_DIAG_PRAGMA(x) _Pragma (#x)
+/* clang has "clang diagnostic" pragmas, but also understands gcc. */
 #  define GCC_DIAG_IGNORE(x) _Pragma("GCC diagnostic push") \
-                             GCC_DIAG_DO_PRAGMA_(GCC diagnostic ignored #x)
+                             GCC_DIAG_PRAGMA(GCC diagnostic ignored #x)
 #  define GCC_DIAG_RESTORE   _Pragma("GCC diagnostic pop")
 #else
 #  define GCC_DIAG_IGNORE(w)