microsoft / DirectXMath

DirectXMath is an all inline SIMD C++ linear algebra library for use in games and graphics apps
https://walbourn.github.io/introducing-directxmath/
MIT License
1.52k stars 234 forks source link

GCC #pragma warning warnings #133

Closed sbd1138 closed 2 years ago

sbd1138 commented 2 years ago

When using DirectXMath with GCC, it generates a handful of warnings dealing with unguarded #pragma warning statements in the headers.

These are impossible to truly disable via

pragma GCC diagnostic ignored "-Wunknown-pragmas"

as these are processed during the preprocessor stage, before GCC deals with warnings (see the output below).

Fortunately, these should be easy to fix by simply wrapping the pragma warnings in question with #if defined( _MSC_VER ) and/or the appropriate MSC version.

Warnings/locations below, (these are with trying the above ignored -Wunknown-pragmas):

DirectXMath.h(100): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(100): warning : 100 | #pragma warning(push) DirectXMath.h(101): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(105): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(105): warning : 105 | #pragma warning(pop) DirectXMath.h(149): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(149): warning : 149 | #pragma warning(push) DirectXMath.h(150): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(153): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(153): warning : 153 | #pragma warning(pop) DirectXMath.h(315): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(315): warning : 315 | #pragma warning(push) DirectXMath.h(316): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(1001): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(1001): warning : 1001 | #pragma warning(pop) DirectXMath.h(2120): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(2120): warning : 2120 | #pragma warning(push) DirectXMath.h(2121): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMathConvert.inl(20): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMathConvert.inl(20): warning : 20 | #pragma warning(push) DirectXMathConvert.inl(21): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMathConvert.inl(221): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMathConvert.inl(221): warning : 221 | #pragma warning(pop) DirectXMath.h(2242): warning : ignoring #pragma warning [-Wunknown-pragmas] DirectXMath.h(2242): warning : 2242 | #pragma warning(pop)

sbd1138 commented 2 years ago

Patched and created pull pull requests for this; sbd1138-patch1 and sbd1138-patch2

walbourn commented 2 years ago

For clang/LLVM and GNUC I generally just always use a bunch of disables including -Wno-unknown-pragmas.

#ifdef __clang__
#pragma clang diagnostic ignored "-Wc++98-compat"
#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
#pragma clang diagnostic ignored "-Wc++98-compat-local-type-template-args"
#pragma clang diagnostic ignored "-Wcovered-switch-default"
#pragma clang diagnostic ignored "-Wfloat-equal"
#pragma clang diagnostic ignored "-Wglobal-constructors"
#pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
#pragma clang diagnostic ignored "-Wlanguage-extension-token"
#pragma clang diagnostic ignored "-Wmissing-variable-declarations"
#pragma clang diagnostic ignored "-Wnested-anon-types"
#pragma clang diagnostic ignored "-Wreserved-id-macro"
#pragma clang diagnostic ignored "-Wswitch-enum"
#pragma clang diagnostic ignored "-Wtautological-type-limit-compare"
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#endif

That said, I can look at adding these specific edits.

sbd1138 commented 2 years ago

Yep, I also have various diagnostic ignored additions in my DirectXMath.h wrapper include. The pragma one is a bit of a special case, because it deals with a preprocessor warning, and thus doesn't really disable the warning due to the way GCC deals with the diagnostics/warnings in the compile phase (as you can see in my original post, it just changes the warning from "unknown pragma" to "ignoring unknown pragma"). It's a known GCC issue.