From 96efb4a4425ebe24c783da1af6c6ae05d80ae887 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 22 Mar 2013 00:10:49 +0000 Subject: [PATCH] Make Clang's robust against system headers defining size_t/ptrdiff_t/wchar_t. Clang's provides definitions for the C standard library types size_t, ptrdiff_t, and wchar_t. However, the system's C standard library headers tend to provide the same typedefs, and the two generally avoid each other using the macros _SIZE_T/_PTRDIFF_T/_WCHAR_T. With modules, however, we need to see *all* of the places where these types are defined, so provide the typedefs (ignoring the macros) when modules are enabled. llvm-svn: 177686 --- clang/lib/Headers/stddef.h | 24 +++++++++++++++++++----- clang/test/Modules/Inputs/StdDef/module.map | 11 +++++++++++ clang/test/Modules/Inputs/StdDef/other.h | 2 ++ clang/test/Modules/Inputs/StdDef/size_t.h | 4 ++++ clang/test/Modules/stddef.m | 7 +++++++ 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 clang/test/Modules/Inputs/StdDef/module.map create mode 100644 clang/test/Modules/Inputs/StdDef/other.h create mode 100644 clang/test/Modules/Inputs/StdDef/size_t.h create mode 100644 clang/test/Modules/stddef.m diff --git a/clang/lib/Headers/stddef.h b/clang/lib/Headers/stddef.h index ad5dc21..5296224 100644 --- a/clang/lib/Headers/stddef.h +++ b/clang/lib/Headers/stddef.h @@ -26,17 +26,28 @@ #ifndef __STDDEF_H #define __STDDEF_H -#ifndef _PTRDIFF_T +#if !defined(_PTRDIFF_T) || __has_feature(modules) +/* Always define ptrdiff_t when modules are available. */ +#if !__has_feature(modules) #define _PTRDIFF_T +#endif typedef __PTRDIFF_TYPE__ ptrdiff_t; #endif -#ifndef _SIZE_T + +#if !defined(_SIZE_T) || __has_feature(modules) +/* Always define size_t when modules are available. */ +#if !__has_feature(modules) #define _SIZE_T +#endif typedef __SIZE_TYPE__ size_t; #endif + #ifndef __cplusplus -#ifndef _WCHAR_T +/* Always define wchar_t when modules are available. */ +#if !defined(_WCHAR_T) || __has_feature(modules) +#if !__has_feature(modules) #define _WCHAR_T +#endif typedef __WCHAR_TYPE__ wchar_t; #endif #endif @@ -66,9 +77,12 @@ using ::std::nullptr_t; /* Some C libraries expect to see a wint_t here. Others (notably MinGW) will use __WINT_TYPE__ directly; accommodate both by requiring __need_wint_t */ #if defined(__need_wint_t) -#if !defined(_WINT_T) +/* Always define wint_t when modules are available. */ +#if !defined(_WINT_T) || __has_feature(modules) +#if !__has_feature(modules) #define _WINT_T +#endif typedef __WINT_TYPE__ wint_t; -#endif /* _WINT_T */ +#endif #undef __need_wint_t #endif /* __need_wint_t */ diff --git a/clang/test/Modules/Inputs/StdDef/module.map b/clang/test/Modules/Inputs/StdDef/module.map new file mode 100644 index 0000000..69c69ea --- /dev/null +++ b/clang/test/Modules/Inputs/StdDef/module.map @@ -0,0 +1,11 @@ +module StdDef { + module SizeT { + header "size_t.h" + export * + } + + module Other { + header "other.h" + export * + } +} diff --git a/clang/test/Modules/Inputs/StdDef/other.h b/clang/test/Modules/Inputs/StdDef/other.h new file mode 100644 index 0000000..f29f636 --- /dev/null +++ b/clang/test/Modules/Inputs/StdDef/other.h @@ -0,0 +1,2 @@ +#include + diff --git a/clang/test/Modules/Inputs/StdDef/size_t.h b/clang/test/Modules/Inputs/StdDef/size_t.h new file mode 100644 index 0000000..9ac61c5 --- /dev/null +++ b/clang/test/Modules/Inputs/StdDef/size_t.h @@ -0,0 +1,4 @@ +#ifndef _SIZE_T +#define _SIZE_T +typedef __SIZE_TYPE__ size_t; +#endif diff --git a/clang/test/Modules/stddef.m b/clang/test/Modules/stddef.m new file mode 100644 index 0000000..83f73f9 --- /dev/null +++ b/clang/test/Modules/stddef.m @@ -0,0 +1,7 @@ +@import StdDef.Other; + +size_t getSize(); + +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I %S/Inputs/StdDef %s -verify +// expected-no-diagnostics -- 2.7.4