1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2016 Jakub Szuppe <j.szuppe@gmail.com>
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 // See http://boostorg.github.com/compute for more information.
9 //---------------------------------------------------------------------------//
10 
11 #ifndef BOOST_COMPUTE_DETAIL_DIAGNOSTIC_HPP
12 #define BOOST_COMPUTE_DETAIL_DIAGNOSTIC_HPP
13 
14 // Macros for suppressing warnings for GCC version 4.6 or later. Usage:
15 //
16 //   BOOST_COMPUTE_BOOST_COMPUTE_GCC_DIAG_OFF(sign-compare);
17 //   if(a < b){
18 //   BOOST_COMPUTE_BOOST_COMPUTE_GCC_DIAG_ON(sign-compare);
19 //
20 // Source: https://svn.boost.org/trac/boost/wiki/Guidelines/WarningsGuidelines
21 #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402
22 #define BOOST_COMPUTE_GCC_DIAG_STR(s) #s
23 #define BOOST_COMPUTE_GCC_DIAG_JOINSTR(x,y) BOOST_COMPUTE_GCC_DIAG_STR(x ## y)
24 # define BOOST_COMPUTE_GCC_DIAG_DO_PRAGMA(x) _Pragma (#x)
25 # define BOOST_COMPUTE_GCC_DIAG_PRAGMA(x) BOOST_COMPUTE_GCC_DIAG_DO_PRAGMA(GCC diagnostic x)
26 # if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
27 #  define BOOST_COMPUTE_GCC_DIAG_OFF(x) BOOST_COMPUTE_GCC_DIAG_PRAGMA(push) \
28       BOOST_COMPUTE_GCC_DIAG_PRAGMA(ignored BOOST_COMPUTE_GCC_DIAG_JOINSTR(-W,x))
29 #  define BOOST_COMPUTE_GCC_DIAG_ON(x) BOOST_COMPUTE_GCC_DIAG_PRAGMA(pop)
30 # else
31 #  define BOOST_COMPUTE_GCC_DIAG_OFF(x) \
32       BOOST_COMPUTE_GCC_DIAG_PRAGMA(ignored BOOST_COMPUTE_GCC_DIAG_JOINSTR(-W,x))
33 #  define BOOST_COMPUTE_GCC_DIAG_ON(x) \
34       BOOST_COMPUTE_GCC_DIAG_PRAGMA(warning BOOST_COMPUTE_GCC_DIAG_JOINSTR(-W,x))
35 # endif
36 #else // Ensure these macros do nothing for other compilers.
37 # define BOOST_COMPUTE_GCC_DIAG_OFF(x)
38 # define BOOST_COMPUTE_GCC_DIAG_ON(x)
39 #endif
40 
41 // Macros for suppressing warnings for Clang.
42 //
43 //   BOOST_COMPUTE_BOOST_COMPUTE_CLANG_DIAG_OFF(sign-compare);
44 //   if(a < b){
45 //   BOOST_COMPUTE_BOOST_COMPUTE_CLANG_DIAG_ON(sign-compare);
46 //
47 // Source: https://svn.boost.org/trac/boost/wiki/Guidelines/WarningsGuidelines
48 #ifdef __clang__
49 #  define BOOST_COMPUTE_CLANG_DIAG_STR(s) # s
50 // stringize s to "no-sign-compare"
51 #  define BOOST_COMPUTE_CLANG_DIAG_JOINSTR(x,y) BOOST_COMPUTE_CLANG_DIAG_STR(x ## y)
52 //  join -W with no-unused-variable to "-Wno-sign-compare"
53 #  define BOOST_COMPUTE_CLANG_DIAG_DO_PRAGMA(x) _Pragma (#x)
54 // _Pragma is unary operator  #pragma ("")
55 #  define BOOST_COMPUTE_CLANG_DIAG_PRAGMA(x) \
56       BOOST_COMPUTE_CLANG_DIAG_DO_PRAGMA(clang diagnostic x)
57 #  define BOOST_COMPUTE_CLANG_DIAG_OFF(x) BOOST_COMPUTE_CLANG_DIAG_PRAGMA(push) \
58       BOOST_COMPUTE_CLANG_DIAG_PRAGMA(ignored BOOST_COMPUTE_CLANG_DIAG_JOINSTR(-W,x))
59 // For example: #pragma clang diagnostic ignored "-Wno-sign-compare"
60 #  define BOOST_COMPUTE_CLANG_DIAG_ON(x) BOOST_COMPUTE_CLANG_DIAG_PRAGMA(pop)
61 // For example: #pragma clang diagnostic warning "-Wno-sign-compare"
62 #else // Ensure these macros do nothing for other compilers.
63 #  define BOOST_COMPUTE_CLANG_DIAG_OFF(x)
64 #  define BOOST_COMPUTE_CLANG_DIAG_ON(x)
65 #  define BOOST_COMPUTE_CLANG_DIAG_PRAGMA(x)
66 #endif
67 
68 // Macros for suppressing warnings for MSVC. Usage:
69 //
70 //   BOOST_COMPUTE_BOOST_COMPUTE_MSVC_DIAG_OFF(4018); //sign-compare
71 //   if(a < b){
72 //   BOOST_COMPUTE_BOOST_COMPUTE_MSVC_DIAG_ON(4018);
73 //
74 #if defined(_MSC_VER)
75 #  define BOOST_COMPUTE_MSVC_DIAG_DO_PRAGMA(x) __pragma(x)
76 #  define BOOST_COMPUTE_MSVC_DIAG_PRAGMA(x) \
77           BOOST_COMPUTE_MSVC_DIAG_DO_PRAGMA(warning(x))
78 #  define BOOST_COMPUTE_MSVC_DIAG_OFF(x) BOOST_COMPUTE_MSVC_DIAG_PRAGMA(push) \
79           BOOST_COMPUTE_MSVC_DIAG_PRAGMA(disable: x)
80 #  define BOOST_COMPUTE_MSVC_DIAG_ON(x) BOOST_COMPUTE_MSVC_DIAG_PRAGMA(pop)
81 #else // Ensure these macros do nothing for other compilers.
82 #  define BOOST_COMPUTE_MSVC_DIAG_OFF(x)
83 #  define BOOST_COMPUTE_MSVC_DIAG_ON(x)
84 #endif
85 
86 // Macros for suppressing warnings for GCC, Clang and MSVC. Usage:
87 //
88 //   BOOST_COMPUTE_DIAG_OFF(sign-compare, sign-compare, 4018);
89 //   if(a < b){
90 //   BOOST_COMPUTE_DIAG_ON(sign-compare, sign-compare, 4018);
91 //
92 #if defined(_MSC_VER) // MSVC
93 #  define BOOST_COMPUTE_DIAG_OFF(gcc, clang, msvc) BOOST_COMPUTE_MSVC_DIAG_OFF(msvc)
94 #  define BOOST_COMPUTE_DIAG_ON(gcc, clang, msvc) BOOST_COMPUTE_MSVC_DIAG_ON(msvc)
95 #elif defined(__clang__) // Clang
96 #  define BOOST_COMPUTE_DIAG_OFF(gcc, clang, msvc) BOOST_COMPUTE_CLANG_DIAG_OFF(clang)
97 #  define BOOST_COMPUTE_DIAG_ON(gcc, clang, msvc) BOOST_COMPUTE_CLANG_DIAG_ON(clang)
98 #elif defined(__GNUC__) // GCC/G++
99 #  define BOOST_COMPUTE_DIAG_OFF(gcc, clang, msvc) BOOST_COMPUTE_GCC_DIAG_OFF(gcc)
100 #  define BOOST_COMPUTE_DIAG_ON(gcc, clang, msvc) BOOST_COMPUTE_GCC_DIAG_ON(gcc)
101 #else // Ensure these macros do nothing for other compilers.
102 #  define BOOST_COMPUTE_DIAG_OFF(gcc, clang, msvc)
103 #  define BOOST_COMPUTE_DIAG_ON(gcc, clang, msvc)
104 #endif
105 
106 #define BOOST_COMPUTE_DISABLE_DEPRECATED_DECLARATIONS() \
107     BOOST_COMPUTE_DIAG_OFF(deprecated-declarations, deprecated-declarations, 4996)
108 #define BOOST_COMPUTE_ENABLE_DEPRECATED_DECLARATIONS() \
109     BOOST_COMPUTE_DIAG_ON(deprecated-declarations, deprecated-declarations, 4996);
110 
111 
112 #endif /* BOOST_COMPUTE_DETAIL_DIAGNOSTIC_HPP */
113