From 6879a07bc8b8e75c35d0e3b765ea718cc1c7aeb2 Mon Sep 17 00:00:00 2001 From: Tomasz Konojacki Date: Thu, 4 Apr 2019 22:39:38 +0200 Subject: [PATCH] implement diagnostics ignore/restore macros for Visual C++ --- perl.h | 13 +++++++++++++ util.c | 41 +++++++++++------------------------------ win32/win32.h | 6 +++--- 3 files changed, 27 insertions(+), 33 deletions(-) diff --git a/perl.h b/perl.h index 6c3002a..df2fc1a 100644 --- a/perl.h +++ b/perl.h @@ -448,6 +448,19 @@ #define CLANG_DIAG_IGNORE_STMT(x) CLANG_DIAG_IGNORE(x) NOOP #define CLANG_DIAG_RESTORE_STMT CLANG_DIAG_RESTORE NOOP +#if defined(_MSC_VER) && (_MSC_VER >= 1300) +# define MSVC_DIAG_IGNORE(x) __pragma(warning(push)) \ + __pragma(warning(disable : x)) +# define MSVC_DIAG_RESTORE __pragma(warning(pop)) +#else +# define MSVC_DIAG_IGNORE(x) +# define MSVC_DIAG_RESTORE +#endif +#define MSVC_DIAG_IGNORE_DECL(x) MSVC_DIAG_IGNORE(x) dNOOP +#define MSVC_DIAG_RESTORE_DECL MSVC_DIAG_RESTORE dNOOP +#define MSVC_DIAG_IGNORE_STMT(x) MSVC_DIAG_IGNORE(x) NOOP +#define MSVC_DIAG_RESTORE_STMT MSVC_DIAG_RESTORE NOOP + #define NOOP /*EMPTY*/(void)0 #define dNOOP struct Perl___notused_struct diff --git a/util.c b/util.c index aa7a045..7276fd9 100644 --- a/util.c +++ b/util.c @@ -1579,13 +1579,8 @@ The function never actually returns. =cut */ -#ifdef _MSC_VER -# pragma warning( push ) -# pragma warning( disable : 4646 ) /* warning C4646: function declared with - __declspec(noreturn) has non-void return type */ -# pragma warning( disable : 4645 ) /* warning C4645: function declared with -__declspec(noreturn) has a return statement */ -#endif +/* silence __declspec(noreturn) warnings */ +MSVC_DIAG_IGNORE(4646 4645) OP * Perl_die_sv(pTHX_ SV *baseex) { @@ -1594,9 +1589,7 @@ Perl_die_sv(pTHX_ SV *baseex) /* NOTREACHED */ NORETURN_FUNCTION_END; } -#ifdef _MSC_VER -# pragma warning( pop ) -#endif +MSVC_DIAG_RESTORE /* =for apidoc Am|OP *|die|const char *pat|... @@ -1609,13 +1602,9 @@ The function never actually returns. */ #if defined(PERL_IMPLICIT_CONTEXT) -#ifdef _MSC_VER -# pragma warning( push ) -# pragma warning( disable : 4646 ) /* warning C4646: function declared with - __declspec(noreturn) has non-void return type */ -# pragma warning( disable : 4645 ) /* warning C4645: function declared with -__declspec(noreturn) has a return statement */ -#endif + +/* silence __declspec(noreturn) warnings */ +MSVC_DIAG_IGNORE(4646 4645) OP * Perl_die_nocontext(const char* pat, ...) { @@ -1627,18 +1616,12 @@ Perl_die_nocontext(const char* pat, ...) va_end(args); NORETURN_FUNCTION_END; } -#ifdef _MSC_VER -# pragma warning( pop ) -#endif +MSVC_DIAG_RESTORE + #endif /* PERL_IMPLICIT_CONTEXT */ -#ifdef _MSC_VER -# pragma warning( push ) -# pragma warning( disable : 4646 ) /* warning C4646: function declared with - __declspec(noreturn) has non-void return type */ -# pragma warning( disable : 4645 ) /* warning C4645: function declared with -__declspec(noreturn) has a return statement */ -#endif +/* silence __declspec(noreturn) warnings */ +MSVC_DIAG_IGNORE(4646 4645) OP * Perl_die(pTHX_ const char* pat, ...) { @@ -1649,9 +1632,7 @@ Perl_die(pTHX_ const char* pat, ...) va_end(args); NORETURN_FUNCTION_END; } -#ifdef _MSC_VER -# pragma warning( pop ) -#endif +MSVC_DIAG_RESTORE /* =for apidoc Am|void|croak_sv|SV *baseex diff --git a/win32/win32.h b/win32/win32.h index ee1d889..73aa67a 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -285,8 +285,7 @@ typedef unsigned short mode_t; # pragma intrinsic(_rotl64,_rotr64) #endif -#pragma warning(push) -#pragma warning(disable:4756;disable:4056) +MSVC_DIAG_IGNORE(4756 4056) PERL_STATIC_INLINE double S_Infinity() { /* this is a real C literal which can get further constant folded @@ -295,7 +294,8 @@ double S_Infinity() { folding INF is creating -INF */ return (DBL_MAX+DBL_MAX); } -#pragma warning(pop) +MSVC_DIAG_RESTORE + #define NV_INF S_Infinity() /* selectany allows duplicate and unused data symbols to be removed by -- 1.8.3.1