diff options
author | Ian Anderson <iana@apple.com> | 2024-03-13 11:15:41 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-13 11:15:41 -0700 |
commit | f50d3582b4844b86ad86372028e44b52c560ec7d (patch) | |
tree | c49097bc38e0b3296682b7ba1d68ada51f2c22e8 /clang/lib/Basic/Module.cpp | |
parent | 3e6d56617f43f86d65dba04c94277dc4a40c2a86 (diff) | |
download | llvm-f50d3582b4844b86ad86372028e44b52c560ec7d.zip llvm-f50d3582b4844b86ad86372028e44b52c560ec7d.tar.gz llvm-f50d3582b4844b86ad86372028e44b52c560ec7d.tar.bz2 |
[clang][modules] giving the __stddef_ headers their own modules can cause redeclaration errors with -fbuiltin-headers-in-system-modules (#84127)
On Apple platforms, some of the stddef.h types are also declared in
system headers. In particular NULL has a conflicting declaration in
<sys/_types/_null.h>. When that's in a different module from
<__stddef_null.h>, redeclaration errors can occur.
Make the \_\_stddef_ headers be non-modular in
-fbuiltin-headers-in-system-modules and restore them back to not
respecting their header guards. Still define the header guards though.
__stddef_max_align_t.h was in _Builtin_stddef_max_align_t prior to the
addition of _Builtin_stddef, and it needs to stay in a module because
struct's can't be type merged. __stddef_wint_t.h didn't used to have a
module, but leave it in it current module since it doesn't really belong
to stddef.h.
Diffstat (limited to 'clang/lib/Basic/Module.cpp')
-rw-r--r-- | clang/lib/Basic/Module.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 9f597dc..256365d 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -301,10 +301,9 @@ bool Module::directlyUses(const Module *Requested) { if (Requested->isSubModuleOf(Use)) return true; - // Anyone is allowed to use our builtin stdarg.h and stddef.h and their - // accompanying modules. - if (Requested->getTopLevelModuleName() == "_Builtin_stdarg" || - Requested->getTopLevelModuleName() == "_Builtin_stddef") + // Anyone is allowed to use our builtin stddef.h and its accompanying modules. + if (Requested->fullModuleNameIs({"_Builtin_stddef", "max_align_t"}) || + Requested->fullModuleNameIs({"_Builtin_stddef_wint_t"})) return true; if (NoUndeclaredIncludes) |