forked from NVIDIA/cub
-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Check for macro collisions with system headers during header testing.
Related to NVIDIA/thrust#1244.
- Loading branch information
1 parent
2442f44
commit 8e09201
Showing
2 changed files
with
49 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,46 @@ | ||
// This source file checks that: | ||
// 1) Header <cub/${header}> compiles without error. | ||
// 2) Common macro collisions with platform/system headers are avoided. | ||
|
||
// Define CUB_MACRO_CHECK(macro, header), which emits a diagnostic indicating | ||
// a potential macro collision and halts. | ||
// | ||
// Use raw platform checks instead of the CUB_HOST_COMPILER macros since we | ||
// don't want to #include any headers other than the one being tested. | ||
// | ||
// This is only implemented for MSVC/GCC/Clang. | ||
#if defined(_MSC_VER) // MSVC | ||
|
||
// Fake up an error for MSVC | ||
#define CUB_MACRO_CHECK_IMPL(msg) \ | ||
/* Print message that looks like an error: */ \ | ||
__pragma(message(__FILE__ ":" CUB_MACRO_CHECK_IMPL0(__LINE__) \ | ||
": error: " #msg)) \ | ||
/* abort compilation due to static_assert or syntax error: */ \ | ||
static_assert(false, #msg); | ||
#define CUB_MACRO_CHECK_IMPL0(x) CUB_MACRO_CHECK_IMPL1(x) | ||
#define CUB_MACRO_CHECK_IMPL1(x) #x | ||
|
||
#elif defined(__clang__) || defined(__GNUC__) | ||
|
||
// GCC/clang are easy: | ||
#define CUB_MACRO_CHECK_IMPL(msg) CUB_MACRO_CHECK_IMPL0(GCC error #msg) | ||
#define CUB_MACRO_CHECK_IMPL0(expr) _Pragma(#expr) | ||
|
||
#endif | ||
|
||
// Hacky way to build a string, but it works on all tested platforms. | ||
#define CUB_MACRO_CHECK(MACRO, HEADER) \ | ||
CUB_MACRO_CHECK_IMPL(Identifier MACRO should not be used from Thrust \ | ||
headers due to conflicts with HEADER.) | ||
|
||
// complex.h conflicts | ||
#define I CUB_MACRO_CHECK('I', complex.h) | ||
|
||
// windows.h conflicts | ||
// Disabling for now; we use min/max in many places, but since most | ||
// projects build with NOMINMAX this doesn't seem to be high priority to fix. | ||
//#define min(...) CUB_MACRO_CHECK('min', windows.h) | ||
//#define max(...) CUB_MACRO_CHECK('max', windows.h) | ||
|
||
#include <cub/${header}> |