/*
*
* Copyright (C) 2016-2022, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: ofstd
*
* Author: Jan Schlamelcher
*
* Purpose: Platform independent macros for suppressing unwanted
* compiler diagnostic output i.e. 'warnings'
*
*/
#ifndef OFDIAG_H
#define OFDIAG_H
#ifdef DOXYGEN
/*! @file ofdiag.h
* @brief Defines macros for controlling compiler diagnostic output, i.e. warnings.
*/
/*! @brief A macro for pushing a compiler diagnostic scope.
* @note The macro may only be used in conjunction with #include!
* @details
* If the compiler supports diagnostic scopes, using this macro
* will create a new one inside which warning messages might be
* disabled selectively.
* The macro will have no effect if the compiler does not support
* diagnostic scopes.
* @remarks Currently supported compilers are GCC (version 4.6 and later, including
* derivates like MinGW), Clang and Visual Studio.
* @details
*
Example
* @code{.cpp}
* int i = 3;
* unsigned ui = 8;
* // will potentially emit a warning, although perfectly safe
* if( i < ui )
* doStuff();
* // create a new diagnostic scope
* #include DCMTK_DIAGNOSTIC_PUSH
* // disable the sign mismatch warning
* #include DCMTK_DIAGNOSTIC_IGNORE_SIGN_COMPARE
* // the warning is omitted!
* if( i < ui )
* doStuff();
* // restore the parent diagnostic scope potentially enabling
* // the sign mismatch warning again
* #include DCMTK_DIAGNOSTIC_POP
* @endcode
*/
#define DCMTK_DIAGNOSTIC_PUSH
/*! @brief A macro for pop-ing a compiler diagnostic scope, restoring the parent scope.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_POP
/*! @brief A macro to disable warnings about comparing signed with unsigned values.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_SIGN_COMPARE
/*! @brief A macro to disable warnings about overflowing constant expressions.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_OVERFLOW
/*! @brief A macro to disable warnings about mixing the keywords struct and class.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
/*! @brief A macro to disable warnings about using \_\_func\_\_ etc. outside of a function.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_PREDEFINED_IDENTIFIER_OUTSIDE_FUNCTION
/*! @brief A macro to disable warnings about implicit type conversions that may alter the value.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_IMPLICIT_CONVERSION
/*! @brief A macro to disable warnings about variable/type name shadowing.
* @note The macro may only be used in conjunction with #include!
* @remarks This warning is typically helpful to prevent unintended behavior, however, small
* structs often have members with matching names as constructor arguments (for consistent
* use/assignment). It makes sense to suppress this warning in that case.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_SHADOW
/*! @brief A macro to disable a Visual Studio specific warning about explicit template instantiation.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_NO_SUITABLE_DEFINITION_FOR_TEMPLATE_INSTANTIATION
/*! @brief A macro to disable the Visual Studio specific "performance warning" about implicit conversion
* to a boolean value.
* @note The macro may only be used in conjunction with #include!
* @remarks The warning was meant to indicate that a non boolean value should probably be stored
* as a boolean value in the first place, instead of using an integer (i.e. when C programmers do C++).
* However, that is hardly ever the case and it is mostly and annoyingly emitted in perfectly fine code
* that checks if a value is not equal to zero etc., therefore, suppressing it is usually appropriate.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_VISUAL_STUDIO_PERFORMANCE_WARNING
/*! @brief A macro to disable warnings about a conditional expression being constant
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that a conditional expression will always yield
* the same result. In C++17, the "if constexpr" statement should be used in this case,
* but DCMTK does not (yet) expect a fully C++17 compliant compiler.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_CONST_EXPRESSION_WARNING
/*! @brief A macro to disable warnings about a self-assignment of a variable
* using an overloaded operator.
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_SELF_ASSIGN_OVERLOADED_WARNING
/*! @brief A macro to disable warnings about an assignment within a conditional expression
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that an assignment takes place within a
* conditional expression, which might indicate that "=" was used erroneously instead of "==".
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_ASSIGNMENT_IN_COND_EXPRESSION_WARNING
/*! @brief A macro to disable warnings about raw memory access to class structures
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that the destination of a call to a raw memory
* function such as memset or memcpy is an object of class type, and when writing
* into such an object might bypass the class non-trivial or deleted constructor
* or copy assignment, violate const-correctness or encapsulation, or corrupt
* virtual table pointers.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_CLASS_MEMACCESS_WARNING
/*! @brief A macro to disable warnings about pessimizing use of std::move().
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that moving a local object in a return
* statement prevents copy elision and thus causes less efficient code
* to be generated.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_PESSIMIZING_MOVE_WARNING
/*! @brief A macro to disable warnings about code that breaks strict
* aliasing rules
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that certain code constructs will
* break strict aliasing rules, such as dereferencing a type-punned pointer.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_STRICT_ALIASING_WARNING
/*! @brief A macro to disable Visual Studio warnings about structure
* padding due to __declspec(align).
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that a certain structure has been
* padded at the end because of a __declspec(align) declaration.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_VISUAL_STUDIO_DECLSPEC_PADDING_WARNING
/*! @brief A macro to disable Visual Studio warnings about non-portability
* of the interaction between a function like setjmp and C++ object destruction
* @note The macro may only be used in conjunction with #include!
* @remarks The warning indicates that on some platforms, functions
* that include 'catch' may not support C++ object semantics of
* destruction when out of scope.
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_VISUAL_STUDIO_OBJECT_DESTRUCTION_WARNING
/*! @brief A macro to disable warnings about unreachable code
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_UNREACHABLE_CODE_WARNING
/*! @brief A macro to disable warnings about ignored attributes due to attribute redeclaration
* @note The macro may only be used in conjunction with #include!
* @see DCMTK_DIAGNOSTIC_PUSH for an example.
*/
#define DCMTK_DIAGNOSTIC_IGNORE_ATTRIBUTE_REDECLARATION
#else // DOXYGEN
#define DCMTK_DIAGNOSTIC_PUSH "dcmtk/ofstd/diag/push.def"
#define DCMTK_DIAGNOSTIC_POP "dcmtk/ofstd/diag/pop.def"
#define DCMTK_DIAGNOSTIC_IGNORE_SIGN_COMPARE "dcmtk/ofstd/diag/signcmp.def"
#define DCMTK_DIAGNOSTIC_IGNORE_OVERFLOW "dcmtk/ofstd/diag/overflow.def"
#define DCMTK_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS "dcmtk/ofstd/diag/mmtag.def"
#define DCMTK_DIAGNOSTIC_IGNORE_PREDEFINED_IDENTIFIER_OUTSIDE_FUNCTION "dcmtk/ofstd/diag/piof.def"
#define DCMTK_DIAGNOSTIC_IGNORE_IMPLICIT_CONVERSION "dcmtk/ofstd/diag/cnvrsn.def"
#define DCMTK_DIAGNOSTIC_IGNORE_SHADOW "dcmtk/ofstd/diag/shadow.def"
#define DCMTK_DIAGNOSTIC_IGNORE_NO_SUITABLE_DEFINITION_FOR_TEMPLATE_INSTANTIATION "dcmtk/ofstd/diag/nsdfti.def"
#define DCMTK_DIAGNOSTIC_IGNORE_VISUAL_STUDIO_PERFORMANCE_WARNING "dcmtk/ofstd/diag/vsprfw.def"
#define DCMTK_DIAGNOSTIC_IGNORE_CONST_EXPRESSION_WARNING "dcmtk/ofstd/diag/constexp.def"
#define DCMTK_DIAGNOSTIC_IGNORE_SELF_ASSIGN_OVERLOADED_WARNING "dcmtk/ofstd/diag/slfassov.def"
#define DCMTK_DIAGNOSTIC_IGNORE_ASSIGNMENT_IN_COND_EXPRESSION_WARNING "dcmtk/ofstd/diag/asincond.def"
#define DCMTK_DIAGNOSTIC_IGNORE_CLASS_MEMACCESS_WARNING "dcmtk/ofstd/diag/memacces.def"
#define DCMTK_DIAGNOSTIC_IGNORE_PESSIMIZING_MOVE_WARNING "dcmtk/ofstd/diag/pessmove.def"
#define DCMTK_DIAGNOSTIC_IGNORE_STRICT_ALIASING_WARNING "dcmtk/ofstd/diag/stralias.def"
#define DCMTK_DIAGNOSTIC_IGNORE_VISUAL_STUDIO_DECLSPEC_PADDING_WARNING "dcmtk/ofstd/diag/vsdeclpd.def"
#define DCMTK_DIAGNOSTIC_IGNORE_VISUAL_STUDIO_OBJECT_DESTRUCTION_WARNING "dcmtk/ofstd/diag/vsobjdes.def"
#define DCMTK_DIAGNOSTIC_IGNORE_UNREACHABLE_CODE_WARNING "dcmtk/ofstd/diag/unreachb.def"
#define DCMTK_DIAGNOSTIC_IGNORE_ATTRIBUTE_REDECLARATION "dcmtk/ofstd/diag/ignrattr.def"
// readable shorthands for compiler version checks
#define DCMTK_DIAGNOSTIC_MIN_GCC_VERSION(MAJOR, MINOR, PATCH)\
(\
defined(__GNUC__) &&\
(\
__GNUC__ > MAJOR ||\
(\
__GNUC__ == MAJOR &&\
(\
__GNUC_MINOR__ > MINOR ||\
(\
__GNUC_MINOR == MINOR &&\
__GNUC_PATCHLEVEL__ >= PATCH\
)\
)\
)\
)\
)
#define DCMTK_DIAGNOSTIC_MIN_MSC_VER(VERSION)\
(\
defined(_MSC_VER) && _MSC_VER >= VERSION\
)
#endif // NOT DOXYGEN
#endif // OFDIAG_H