diff --git a/doc/macro_reference.qbk b/doc/macro_reference.qbk index 639093ac..d77d88bc 100644 --- a/doc/macro_reference.qbk +++ b/doc/macro_reference.qbk @@ -399,6 +399,13 @@ containing header should be included only once while preprocessing the current translation unit. The pragma may improve compile times of large projects with some compilers. ]] +[[`BOOST_HAS_PRAGMA_DETECT_MISSMATCH`][Compiler][ +The compiler recognizes the `#pragma detect_mismatch("name", "value")` directive which tells that the +link stage should be terminated with error if values for provided `"name"` missmatch. +This pragma may be a help in preventing ODR violations and ensuring that different modules +are compiled with same flags. +]] + [[`BOOST_HAS_PTHREAD_DELAY_NP`][Platform][ The platform has the POSIX API `pthread_delay_np`. ]] diff --git a/include/boost/config/compiler/clang.hpp b/include/boost/config/compiler/clang.hpp index 6a178242..d6ea0cdd 100644 --- a/include/boost/config/compiler/clang.hpp +++ b/include/boost/config/compiler/clang.hpp @@ -10,6 +10,15 @@ #define BOOST_HAS_PRAGMA_ONCE +// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used. +#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4)) + // Ignoring the checks on APPLE platform because someone made __clang_major__ equal to + // LLVM version rather than compiler version. +# ifndef __APPLE__ +# define BOOST_HAS_PRAGMA_DETECT_MISSMATCH +# endif +#endif + // When compiling with clang before __has_extension was defined, // even if one writes 'defined(__has_extension) && __has_extension(xxx)', // clang reports a compiler error. So the only workaround found is: diff --git a/include/boost/config/compiler/visualc.hpp b/include/boost/config/compiler/visualc.hpp index 6245a051..b0d093c6 100644 --- a/include/boost/config/compiler/visualc.hpp +++ b/include/boost/config/compiler/visualc.hpp @@ -36,6 +36,9 @@ #define BOOST_HAS_PRAGMA_ONCE +// Will be undefined for old compilers lower in this file +#define BOOST_HAS_PRAGMA_DETECT_MISSMATCH + // // versions check: // we don't support Visual C++ prior to version 7.1: @@ -59,6 +62,7 @@ #if _MSC_VER < 1500 // 140X == VC++ 8.0 # define BOOST_NO_MEMBER_TEMPLATE_FRIENDS +# undef BOOST_HAS_PRAGMA_DETECT_MISSMATCH #endif #if _MSC_VER < 1600 // 150X == VC++ 9.0