From 57cd1d1454653f778837eec0ee5d4060bc59c5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Fonseca?= Date: Tue, 12 Mar 2013 20:37:47 +0000 Subject: [PATCH] include: Fix build with VS 11 (i.e, 2012). NOTE: Candidate for the stable branches. Reviewed-by: Brian Paul --- include/c99_compat.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/include/c99_compat.h b/include/c99_compat.h index 39f958fdfdd..3a9f502a7ea 100644 --- a/include/c99_compat.h +++ b/include/c99_compat.h @@ -29,6 +29,37 @@ #define _C99_COMPAT_H_ +/* + * MSVC hacks. + */ +#if defined(_MSC_VER) + /* + * Visual Studio 2012 will complain if we define the `inline` keyword, but + * actually it only supports the keyword on C++. + * + * We could skip this check by defining _ALLOW_KEYWORD_MACROS, but there is + * probably value in checking this for other keywords. So simply include + * the checking before we define it below. + */ +# if _MSC_VER >= 1700 +# include +# endif + + /* + * XXX: MSVC has a `__restrict` keyword, but it also has a + * `__declspec(restrict)` modifier, so it is impossible to define a + * `restrict` macro without interfering with the latter. Furthermore the + * MSVC standard library uses __declspec(restrict) under the _CRTRESTRICT + * macro. For now resolve this issue by redefining _CRTRESTRICT, but going + * forward we should probably should stop using restrict, especially + * considering that our code does not obbey strict aliasing rules any way. + */ +# include +# undef _CRTRESTRICT +# define _CRTRESTRICT +#endif + + /* * C99 inline keyword */ @@ -102,4 +133,15 @@ #endif +/* Simple test case for debugging */ +#if 0 +static inline const char * +test_c99_compat_h(const void * restrict a, + const void * restrict b) +{ + return __func__; +} +#endif + + #endif /* _C99_COMPAT_H_ */