diff options
-rw-r--r-- | clang/lib/Headers/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/lib/Headers/__stddef_max_align_t.h | 40 | ||||
-rw-r--r-- | clang/lib/Headers/module.modulemap | 4 | ||||
-rw-r--r-- | clang/lib/Headers/stddef.h | 29 | ||||
-rw-r--r-- | clang/test/Headers/c11.c | 2 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/StdDef/include_again.h | 2 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/StdDef/module.map | 10 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/StdDef/ptrdiff_t.h | 2 | ||||
-rw-r--r-- | clang/test/Modules/stddef.c | 13 | ||||
-rw-r--r-- | clang/test/Modules/system_headers.m | 7 |
10 files changed, 89 insertions, 21 deletions
diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index d23e2122e31..f5457807857 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -35,6 +35,7 @@ set(files stdarg.h stdbool.h stddef.h + __stddef_max_align_t.h stdint.h stdnoreturn.h tbmintrin.h diff --git a/clang/lib/Headers/__stddef_max_align_t.h b/clang/lib/Headers/__stddef_max_align_t.h new file mode 100644 index 00000000000..a06f412c53f --- /dev/null +++ b/clang/lib/Headers/__stddef_max_align_t.h @@ -0,0 +1,40 @@ +/*===---- __stddef_max_align_t.h - Definition of max_align_t for modules ---=== + * + * Copyright (c) 2014 Chandler Carruth + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + *===-----------------------------------------------------------------------=== + */ + +#ifndef __CLANG_MAX_ALIGN_T_DEFINED +#define __CLANG_MAX_ALIGN_T_DEFINED + +#ifndef _MSC_VER +typedef struct { + long long __clang_max_align_nonce1 + __attribute__((__aligned__(__alignof__(long long)))); + long double __clang_max_align_nonce2 + __attribute__((__aligned__(__alignof__(long double)))); +} max_align_t; +#else +typedef double max_align_t; +#endif + +#endif diff --git a/clang/lib/Headers/module.modulemap b/clang/lib/Headers/module.modulemap index 93e4d65b8f1..3c42477405b 100644 --- a/clang/lib/Headers/module.modulemap +++ b/clang/lib/Headers/module.modulemap @@ -170,3 +170,7 @@ module _Builtin_intrinsics [system] { } } } + +module _Builtin_stddef_max_align_t [system] [extern_c] { + header "__stddef_max_align_t.h" +} diff --git a/clang/lib/Headers/stddef.h b/clang/lib/Headers/stddef.h index 2dfe0a29b2a..73549967115 100644 --- a/clang/lib/Headers/stddef.h +++ b/clang/lib/Headers/stddef.h @@ -30,11 +30,15 @@ #if !defined(__need_ptrdiff_t) && !defined(__need_size_t) && \ !defined(__need_wchar_t) && !defined(__need_NULL) && \ !defined(__need_wint_t) +/* Always define miscellaneous pieces when modules are available. */ +#if !__has_feature(modules) #define __STDDEF_H +#endif #define __need_ptrdiff_t #define __need_size_t #define __need_wchar_t #define __need_NULL +#define __need_STDDEF_H_misc /* __need_wint_t is intentionally not defined here. */ #endif @@ -60,7 +64,7 @@ typedef __SIZE_TYPE__ size_t; #undef __need_size_t #endif /*defined(__need_size_t) */ -#if defined(__STDDEF_H) +#if defined(__need_STDDEF_H_misc) /* ISO9899:2011 7.20 (C11 Annex K): Define rsize_t if __STDC_WANT_LIB_EXT1__ is * enabled. */ #if (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 && \ @@ -71,7 +75,7 @@ typedef __SIZE_TYPE__ size_t; #endif typedef __SIZE_TYPE__ rsize_t; #endif -#endif /* defined(__STDDEF_H) */ +#endif /* defined(__need_STDDEF_H_misc) */ #if defined(__need_wchar_t) #ifndef __cplusplus @@ -109,26 +113,13 @@ using ::std::nullptr_t; #undef __need_NULL #endif /* defined(__need_NULL) */ -#if defined(__STDDEF_H) - +#if defined(__need_STDDEF_H_misc) #if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L -#if !defined(__CLANG_MAX_ALIGN_T_DEFINED) || __has_feature(modules) -#ifndef _MSC_VER -typedef struct { - long long __clang_max_align_nonce1 - __attribute__((__aligned__(__alignof__(long long)))); - long double __clang_max_align_nonce2 - __attribute__((__aligned__(__alignof__(long double)))); -} max_align_t; -#else -typedef double max_align_t; +#include "__stddef_max_align_t.h" #endif -#define __CLANG_MAX_ALIGN_T_DEFINED -#endif -#endif - #define offsetof(t, d) __builtin_offsetof(t, d) -#endif /* __STDDEF_H */ +#undef __need_STDDEF_H_misc +#endif /* defined(__need_STDDEF_H_misc) */ /* 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 */ diff --git a/clang/test/Headers/c11.c b/clang/test/Headers/c11.c index b7b15011f3c..6594823c273 100644 --- a/clang/test/Headers/c11.c +++ b/clang/test/Headers/c11.c @@ -1,6 +1,6 @@ // RUN: rm -rf %t // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 %s -// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -fmodules -fmodules-cache-path=%t %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -fmodules -fmodules-cache-path=%t %s -D__STDC_WANT_LIB_EXT1__=1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -triple i686-pc-win32 -fms-compatibility-version=17.00 %s diff --git a/clang/test/Modules/Inputs/StdDef/include_again.h b/clang/test/Modules/Inputs/StdDef/include_again.h new file mode 100644 index 00000000000..f29f6366cc6 --- /dev/null +++ b/clang/test/Modules/Inputs/StdDef/include_again.h @@ -0,0 +1,2 @@ +#include <stddef.h> + diff --git a/clang/test/Modules/Inputs/StdDef/module.map b/clang/test/Modules/Inputs/StdDef/module.map index 69c69eac35b..5c4e0dae7ba 100644 --- a/clang/test/Modules/Inputs/StdDef/module.map +++ b/clang/test/Modules/Inputs/StdDef/module.map @@ -8,4 +8,14 @@ module StdDef { header "other.h" export * } + + module PtrDiffT { + header "ptrdiff_t.h" + export * + } + + module IncludeAgain { + header "include_again.h" + export * + } } diff --git a/clang/test/Modules/Inputs/StdDef/ptrdiff_t.h b/clang/test/Modules/Inputs/StdDef/ptrdiff_t.h new file mode 100644 index 00000000000..acb0ab81ffc --- /dev/null +++ b/clang/test/Modules/Inputs/StdDef/ptrdiff_t.h @@ -0,0 +1,2 @@ +#define __need_ptrdiff_t +#include <stddef.h> diff --git a/clang/test/Modules/stddef.c b/clang/test/Modules/stddef.c new file mode 100644 index 00000000000..aefc90f9a11 --- /dev/null +++ b/clang/test/Modules/stddef.c @@ -0,0 +1,13 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -I%S/Inputs/StdDef %s -verify -fno-modules-error-recovery + +#include "ptrdiff_t.h" + +ptrdiff_t pdt; + +size_t st; // expected-error {{must be imported}} +// expected-note@stddef.h:* {{previous}} + +#include "include_again.h" + +size_t st2; diff --git a/clang/test/Modules/system_headers.m b/clang/test/Modules/system_headers.m index 39b13ca5fc4..8adc7e85769 100644 --- a/clang/test/Modules/system_headers.m +++ b/clang/test/Modules/system_headers.m @@ -1,8 +1,13 @@ // Test that system-headerness works for building modules. // RUN: rm -rf %t -// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache -isystem %S/Inputs -pedantic -Werror %s -verify +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache -isystem %S/Inputs -pedantic -Werror %s -verify -std=c11 // expected-no-diagnostics @import warning; int i = bigger_than_int; + +#include <stddef.h> + +#define __need_size_t +#include <stddef.h> |