1 /* 2 * diagnostic.h -- compiler diagnostic abstractions 3 * 4 * Copyright (c) 2022-2023, NLnet Labs. All rights reserved. 5 * 6 * SPDX-License-Identifier: BSD-3-Clause 7 * 8 */ 9 #ifndef DIAGNOSTIC_H 10 #define DIAGNOSTIC_H 11 12 #if _MSC_VER 13 # define diagnostic_push() \ 14 __pragma(warning(push)) 15 # define msvc_diagnostic_ignored(warning_specifier) \ 16 __pragma(warning(disable:warning_specifier)) 17 # define diagnostic_pop() \ 18 __pragma(warning(pop)) 19 // Support for selectively enabling and disabling warnings via 20 // #pragma GCC diagnostic was added in GCC 4.6 21 // (https://gcc.gnu.org/gcc-4.6/changes.html). 22 #elif (defined __clang__) \ 23 || (defined __GNUC__ && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 406)) 24 # define stringify(x) #x 25 # define paste(flag, warning) stringify(flag ## warning) 26 # define pragma(x) _Pragma(#x) 27 # define diagnostic_ignored(warning) pragma(warning) 28 29 # define diagnostic_push() _Pragma("GCC diagnostic push") 30 # define diagnostic_pop() _Pragma("GCC diagnostic pop") 31 # if __clang__ 32 # define clang_diagnostic_ignored(warning) \ 33 diagnostic_ignored(GCC diagnostic ignored paste(-W,warning)) 34 # else 35 # define gcc_diagnostic_ignored(warning) \ 36 diagnostic_ignored(GCC diagnostic ignored paste(-W,warning)) 37 # endif 38 #endif 39 40 #if !defined diagnostic_push 41 # define diagnostic_push() 42 # define diagnostic_pop() 43 #endif 44 45 #if !defined gcc_diagnostic_ignored 46 # define gcc_diagnostic_ignored(warning) 47 #endif 48 49 #if !defined clang_diagnostic_ignored 50 # define clang_diagnostic_ignored(warning) 51 #endif 52 53 #if !defined msvc_diagnostic_ignored 54 # define msvc_diagnostic_ignored(warning) 55 #endif 56 57 #endif // DIAGNOSTIC_H 58