]> granicus.if.org Git - clang/commitdiff
<rdar://problem/13479214> Make Clang's <stddef.h> robust against system headers defin...
authorDouglas Gregor <dgregor@apple.com>
Fri, 22 Mar 2013 00:10:49 +0000 (00:10 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 22 Mar 2013 00:10:49 +0000 (00:10 +0000)
Clang's <stddef.h> 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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177686 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/stddef.h
test/Modules/Inputs/StdDef/module.map [new file with mode: 0644]
test/Modules/Inputs/StdDef/other.h [new file with mode: 0644]
test/Modules/Inputs/StdDef/size_t.h [new file with mode: 0644]
test/Modules/stddef.m [new file with mode: 0644]

index ad5dc21fb0443cdd8630dde9495223770271fa05..52962248f67f5810f5ae49fd007a8e1bd53e0332 100644 (file)
 #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/test/Modules/Inputs/StdDef/module.map b/test/Modules/Inputs/StdDef/module.map
new file mode 100644 (file)
index 0000000..69c69ea
--- /dev/null
@@ -0,0 +1,11 @@
+module StdDef {
+  module SizeT {
+    header "size_t.h"
+    export *
+  }
+
+  module Other {
+    header "other.h"
+    export *
+  }
+}
diff --git a/test/Modules/Inputs/StdDef/other.h b/test/Modules/Inputs/StdDef/other.h
new file mode 100644 (file)
index 0000000..f29f636
--- /dev/null
@@ -0,0 +1,2 @@
+#include <stddef.h>
+
diff --git a/test/Modules/Inputs/StdDef/size_t.h b/test/Modules/Inputs/StdDef/size_t.h
new file mode 100644 (file)
index 0000000..9ac61c5
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef _SIZE_T
+#define _SIZE_T
+typedef __SIZE_TYPE__ size_t;
+#endif
diff --git a/test/Modules/stddef.m b/test/Modules/stddef.m
new file mode 100644 (file)
index 0000000..83f73f9
--- /dev/null
@@ -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