This repository has been archived by the owner on Mar 21, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 757
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Check for name collisions with system header macros.
Fix places where using `I` for an identifier was causing conflicts with complex.h. Fixes #1244.
- Loading branch information
1 parent
ff00c81
commit 691b021
Showing
6 changed files
with
79 additions
and
15 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,4 +1,55 @@ | ||
// This source file checks that: | ||
// 1) Header <thrust/${header}> compiles without error. | ||
// 2) Common macro collisions with platform/system headers are avoided. | ||
|
||
// Turn off failures for certain configurations: | ||
#define THRUST_CPP11_REQUIRED_NO_ERROR | ||
#define THRUST_CPP14_REQUIRED_NO_ERROR | ||
#define THRUST_MODERN_GCC_REQUIRED_NO_ERROR | ||
|
||
#ifndef THRUST_IGNORE_MACRO_CHECKS | ||
|
||
// Define THRUST_MACRO_CHECK(macro, header), which emits a diagnostic indicating | ||
// a potential macro collision and halts. | ||
// | ||
// Hacky way to build a string, but it works on all tested platforms. | ||
#define THRUST_MACRO_CHECK(MACRO, HEADER) \ | ||
THRUST_MACRO_CHECK_IMPL(Identifier MACRO should not be used from Thrust \ | ||
headers due to conflicts with HEADER.) | ||
|
||
// Use raw platform checks instead of the THRUST_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 THRUST_MACRO_CHECK_IMPL(msg) \ | ||
/* Print message that looks like an error: */ \ | ||
__pragma(message(__FILE__ ":" THRUST_MACRO_CHECK_IMPL0(__LINE__) \ | ||
": error: " #msg)) \ | ||
/* abort compilation due to static_assert or syntax error: */ \ | ||
static_assert(false, #msg); | ||
#define THRUST_MACRO_CHECK_IMPL0(x) THRUST_MACRO_CHECK_IMPL1(x) | ||
#define THRUST_MACRO_CHECK_IMPL1(x) #x | ||
|
||
#elif defined(__clang__) || defined(__GNUC__) | ||
|
||
// GCC/clang are easy: | ||
#define THRUST_MACRO_CHECK_IMPL(msg) THRUST_MACRO_CHECK_IMPL0(GCC error #msg) | ||
#define THRUST_MACRO_CHECK_IMPL0(expr) _Pragma(#expr) | ||
|
||
#endif | ||
|
||
// complex.h conflicts | ||
#define I THRUST_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(...) THRUST_MACRO_CHECK('min', windows.h) | ||
//#define max(...) THRUST_MACRO_CHECK('max', windows.h) | ||
|
||
#endif // THRUST_IGNORE_MACRO_CHECKS | ||
|
||
#include <thrust/${header}> |
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
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