Specify public STL headers explicitly (issue #132).
Add STL mapping suitable for different STL implementations instead of relying on libstdc++ mappings to provide all public STL headers implicitly.
This commit is contained in:
parent
461e0eed28
commit
147dfb6dd9
36
gcc.libc.imp
36
gcc.libc.imp
|
@ -198,40 +198,4 @@
|
||||||
{ include: [ "<linux/limits.h>", private, "<limits.h>", public ] }, # PATH_MAX
|
{ include: [ "<linux/limits.h>", private, "<limits.h>", public ] }, # PATH_MAX
|
||||||
{ include: [ "<linux/prctl.h>", private, "<sys/prctl.h>", public ] },
|
{ include: [ "<linux/prctl.h>", private, "<sys/prctl.h>", public ] },
|
||||||
{ include: [ "<sys/ucontext.h>", private, "<ucontext.h>", public ] },
|
{ include: [ "<sys/ucontext.h>", private, "<ucontext.h>", public ] },
|
||||||
# Allow the C++ wrappers around C files. Without these mappings,
|
|
||||||
# if you #include <cstdio>, iwyu will tell you to replace it with
|
|
||||||
# <stdio.h>, which is where the symbols are actually defined. We
|
|
||||||
# inhibit that behavior to keep the <cstdio> alone. Note this is a
|
|
||||||
# public-to-public mapping: we don't want to *replace* <assert.h>
|
|
||||||
# with <cassert>, we just want to avoid suggesting changing
|
|
||||||
# <cassert> back to <assert.h>. (If you *did* want to replace
|
|
||||||
# assert.h with cassert, you'd change it to a public->private
|
|
||||||
# mapping.) Here is how I identified the files to map:
|
|
||||||
# $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done
|
|
||||||
{ include: [ "<assert.h>", public, "<cassert>", public ] },
|
|
||||||
{ include: [ "<complex.h>", public, "<ccomplex>", public ] },
|
|
||||||
{ include: [ "<ctype.h>", public, "<cctype>", public ] },
|
|
||||||
{ include: [ "<errno.h>", public, "<cerrno>", public ] },
|
|
||||||
{ include: [ "<fenv.h>", public, "<cfenv>", public ] },
|
|
||||||
{ include: [ "<float.h>", public, "<cfloat>", public ] },
|
|
||||||
{ include: [ "<inttypes.h>", public, "<cinttypes>", public ] },
|
|
||||||
{ include: [ "<iso646.h>", public, "<ciso646>", public ] },
|
|
||||||
{ include: [ "<limits.h>", public, "<climits>", public ] },
|
|
||||||
{ include: [ "<locale.h>", public, "<clocale>", public ] },
|
|
||||||
{ include: [ "<math.h>", public, "<cmath>", public ] },
|
|
||||||
{ include: [ "<setjmp.h>", public, "<csetjmp>", public ] },
|
|
||||||
{ include: [ "<signal.h>", public, "<csignal>", public ] },
|
|
||||||
{ include: [ "<stdalign.h>", public, "<cstdalign>", public ] },
|
|
||||||
{ include: [ "<stdarg.h>", public, "<cstdarg>", public ] },
|
|
||||||
{ include: [ "<stdbool.h>", public, "<cstdbool>", public ] },
|
|
||||||
{ include: [ "<stddef.h>", public, "<cstddef>", public ] },
|
|
||||||
{ include: [ "<stdint.h>", public, "<cstdint>", public ] },
|
|
||||||
{ include: [ "<stdio.h>", public, "<cstdio>", public ] },
|
|
||||||
{ include: [ "<stdlib.h>", public, "<cstdlib>", public ] },
|
|
||||||
{ include: [ "<string.h>", public, "<cstring>", public ] },
|
|
||||||
{ include: [ "<tgmath.h>", public, "<ctgmath>", public ] },
|
|
||||||
{ include: [ "<time.h>", public, "<ctime>", public ] },
|
|
||||||
{ include: [ "<uchar.h>", public, "<cuchar>", public ] },
|
|
||||||
{ include: [ "<wchar.h>", public, "<cwchar>", public ] },
|
|
||||||
{ include: [ "<wctype.h>", public, "<cwctype>", public ] },
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -3,5 +3,6 @@
|
||||||
{ ref: gcc.libc.imp },
|
{ ref: gcc.libc.imp },
|
||||||
{ ref: gcc.symbols.imp },
|
{ ref: gcc.symbols.imp },
|
||||||
{ ref: gcc.stl.headers.imp },
|
{ ref: gcc.stl.headers.imp },
|
||||||
|
{ ref: stl.c.headers.imp },
|
||||||
{ ref: third_party.imp }
|
{ ref: third_party.imp }
|
||||||
]
|
]
|
||||||
|
|
|
@ -429,6 +429,9 @@ const IncludeMapEntry libc_include_map[] = {
|
||||||
{ "<linux/limits.h>", kPrivate, "<limits.h>", kPublic }, // PATH_MAX
|
{ "<linux/limits.h>", kPrivate, "<limits.h>", kPublic }, // PATH_MAX
|
||||||
{ "<linux/prctl.h>", kPrivate, "<sys/prctl.h>", kPublic },
|
{ "<linux/prctl.h>", kPrivate, "<sys/prctl.h>", kPublic },
|
||||||
{ "<sys/ucontext.h>", kPrivate, "<ucontext.h>", kPublic },
|
{ "<sys/ucontext.h>", kPrivate, "<ucontext.h>", kPublic },
|
||||||
|
};
|
||||||
|
|
||||||
|
const IncludeMapEntry stdlib_c_include_map[] = {
|
||||||
// Allow the C++ wrappers around C files. Without these mappings,
|
// Allow the C++ wrappers around C files. Without these mappings,
|
||||||
// if you #include <cstdio>, iwyu will tell you to replace it with
|
// if you #include <cstdio>, iwyu will tell you to replace it with
|
||||||
// <stdio.h>, which is where the symbols are actually defined. We
|
// <stdio.h>, which is where the symbols are actually defined. We
|
||||||
|
@ -439,6 +442,10 @@ const IncludeMapEntry libc_include_map[] = {
|
||||||
// assert.h with cassert, you'd change it to a public->private
|
// assert.h with cassert, you'd change it to a public->private
|
||||||
// mapping.) Here is how I identified the files to map:
|
// mapping.) Here is how I identified the files to map:
|
||||||
// $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done
|
// $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done
|
||||||
|
//
|
||||||
|
// These headers are defined in C++14 [headers]p3. You can get them with
|
||||||
|
// $ sed -n '/begin{floattable}.*{tab:cpp.c.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{<c(.*)>}/ && print qq@ { "<$1.h>", kPublic, "<c$1>", kPublic },@' | sort
|
||||||
|
// on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex
|
||||||
{ "<assert.h>", kPublic, "<cassert>", kPublic },
|
{ "<assert.h>", kPublic, "<cassert>", kPublic },
|
||||||
{ "<complex.h>", kPublic, "<ccomplex>", kPublic },
|
{ "<complex.h>", kPublic, "<ccomplex>", kPublic },
|
||||||
{ "<ctype.h>", kPublic, "<cctype>", kPublic },
|
{ "<ctype.h>", kPublic, "<cctype>", kPublic },
|
||||||
|
@ -467,6 +474,65 @@ const IncludeMapEntry libc_include_map[] = {
|
||||||
{ "<wctype.h>", kPublic, "<cwctype>", kPublic },
|
{ "<wctype.h>", kPublic, "<cwctype>", kPublic },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const char* stdlib_cpp_public_headers[] = {
|
||||||
|
// These headers are defined in C++14 [headers]p2. You can get them with
|
||||||
|
// $ sed -n '/begin{floattable}.*{tab:cpp.library.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{(.*)}/ && print qq@ "$1",@' | sort
|
||||||
|
// on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex
|
||||||
|
"<algorithm>",
|
||||||
|
"<array>",
|
||||||
|
"<atomic>",
|
||||||
|
"<bitset>",
|
||||||
|
"<chrono>",
|
||||||
|
"<codecvt>",
|
||||||
|
"<complex>",
|
||||||
|
"<condition_variable>",
|
||||||
|
"<deque>",
|
||||||
|
"<exception>",
|
||||||
|
"<forward_list>",
|
||||||
|
"<fstream>",
|
||||||
|
"<functional>",
|
||||||
|
"<future>",
|
||||||
|
"<initializer_list>",
|
||||||
|
"<iomanip>",
|
||||||
|
"<ios>",
|
||||||
|
"<iosfwd>",
|
||||||
|
"<iostream>",
|
||||||
|
"<istream>",
|
||||||
|
"<iterator>",
|
||||||
|
"<limits>",
|
||||||
|
"<list>",
|
||||||
|
"<locale>",
|
||||||
|
"<map>",
|
||||||
|
"<memory>",
|
||||||
|
"<mutex>",
|
||||||
|
"<new>",
|
||||||
|
"<numeric>",
|
||||||
|
"<ostream>",
|
||||||
|
"<queue>",
|
||||||
|
"<random>",
|
||||||
|
"<ratio>",
|
||||||
|
"<regex>",
|
||||||
|
"<scoped_allocator>",
|
||||||
|
"<set>",
|
||||||
|
"<sstream>",
|
||||||
|
"<stack>",
|
||||||
|
"<stdexcept>",
|
||||||
|
"<streambuf>",
|
||||||
|
"<string>",
|
||||||
|
"<strstream>",
|
||||||
|
"<system_error>",
|
||||||
|
"<thread>",
|
||||||
|
"<tuple>",
|
||||||
|
"<type_traits>",
|
||||||
|
"<typeindex>",
|
||||||
|
"<typeinfo>",
|
||||||
|
"<unordered_map>",
|
||||||
|
"<unordered_set>",
|
||||||
|
"<utility>",
|
||||||
|
"<valarray>",
|
||||||
|
"<vector>",
|
||||||
|
};
|
||||||
|
|
||||||
// Private -> public include mappings for GNU libstdc++
|
// Private -> public include mappings for GNU libstdc++
|
||||||
const IncludeMapEntry libstdcpp_include_map[] = {
|
const IncludeMapEntry libstdcpp_include_map[] = {
|
||||||
// ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include' {ext/,tr1/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { "<$2>", kPrivate, "<$1>", kPublic },@' | grep -e bits/ -e tr1_impl/ | sort -u)
|
// ( cd /usr/crosstool/v12/gcc-4.3.1-glibc-2.3.6-grte/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/include/c++/4.3.1 && grep '^ *# *include' {ext/,tr1/,}* | perl -nle 'm/^([^:]+).*<([^>]+)>/ && print qq@ { "<$2>", kPrivate, "<$1>", kPublic },@' | grep -e bits/ -e tr1_impl/ | sort -u)
|
||||||
|
@ -890,8 +956,13 @@ void IncludePicker::AddDefaultMappings() {
|
||||||
|
|
||||||
AddIncludeMappings(libc_include_map,
|
AddIncludeMappings(libc_include_map,
|
||||||
IWYU_ARRAYSIZE(libc_include_map));
|
IWYU_ARRAYSIZE(libc_include_map));
|
||||||
|
AddIncludeMappings(stdlib_c_include_map,
|
||||||
|
IWYU_ARRAYSIZE(stdlib_c_include_map));
|
||||||
AddIncludeMappings(libstdcpp_include_map,
|
AddIncludeMappings(libstdcpp_include_map,
|
||||||
IWYU_ARRAYSIZE(libstdcpp_include_map));
|
IWYU_ARRAYSIZE(libstdcpp_include_map));
|
||||||
|
|
||||||
|
AddPublicIncludes(stdlib_cpp_public_headers,
|
||||||
|
IWYU_ARRAYSIZE(stdlib_cpp_public_headers));
|
||||||
}
|
}
|
||||||
|
|
||||||
void IncludePicker::MarkVisibility(
|
void IncludePicker::MarkVisibility(
|
||||||
|
@ -1005,6 +1076,13 @@ void IncludePicker::AddSymbolMappings(const IncludeMapEntry* entries,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IncludePicker::AddPublicIncludes(const char** includes, size_t count) {
|
||||||
|
for (size_t i = 0; i < count; ++i) {
|
||||||
|
const char* include = includes[i];
|
||||||
|
MarkVisibility(include, kPublic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void IncludePicker::MarkIncludeAsPrivate(
|
void IncludePicker::MarkIncludeAsPrivate(
|
||||||
const string& quoted_filepath_pattern) {
|
const string& quoted_filepath_pattern) {
|
||||||
CHECK_(!has_called_finalize_added_include_lines_ && "Can't mutate anymore");
|
CHECK_(!has_called_finalize_added_include_lines_ && "Can't mutate anymore");
|
||||||
|
|
|
@ -173,6 +173,8 @@ class IncludePicker {
|
||||||
void AddIncludeMappings(const IncludeMapEntry* entries, size_t count);
|
void AddIncludeMappings(const IncludeMapEntry* entries, size_t count);
|
||||||
void AddSymbolMappings(const IncludeMapEntry* entries, size_t count);
|
void AddSymbolMappings(const IncludeMapEntry* entries, size_t count);
|
||||||
|
|
||||||
|
void AddPublicIncludes(const char** includes, size_t count);
|
||||||
|
|
||||||
// Expands the regex keys in filepath_include_map_ and
|
// Expands the regex keys in filepath_include_map_ and
|
||||||
// friend_to_headers_map_ by matching them against all source files
|
// friend_to_headers_map_ by matching them against all source files
|
||||||
// seen by iwyu.
|
// seen by iwyu.
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
[
|
||||||
|
# Allow the C++ wrappers around C files. Without these mappings,
|
||||||
|
# if you #include <cstdio>, iwyu will tell you to replace it with
|
||||||
|
# <stdio.h>, which is where the symbols are actually defined. We
|
||||||
|
# inhibit that behavior to keep the <cstdio> alone. Note this is a
|
||||||
|
# public-to-public mapping: we don't want to *replace* <assert.h>
|
||||||
|
# with <cassert>, we just want to avoid suggesting changing
|
||||||
|
# <cassert> back to <assert.h>. (If you *did* want to replace
|
||||||
|
# assert.h with cassert, you'd change it to a public->private
|
||||||
|
# mapping.) Here is how I identified the files to map:
|
||||||
|
# $ for i in /usr/include/c++/4.4/c* ; do ls /usr/include/`basename $i | cut -b2-`.h /usr/lib/gcc/*/4.4/include/`basename $i | cut -b2-`.h 2>/dev/null ; done
|
||||||
|
#
|
||||||
|
# These headers are defined in C++14 [headers]p3. You can get them with
|
||||||
|
# $ sed -n '/begin{floattable}.*{tab:cpp.c.headers}/,/end{floattable}/p' lib-intro.tex | grep tcode | perl -nle 'm/tcode{<c(.*)>}/ && print qq@ { include: [ "<$1.h>", public, "<c$1>", public ] },@' | sort
|
||||||
|
# on https://github.com/cplusplus/draft/blob/master/source/lib-intro.tex
|
||||||
|
{ include: [ "<assert.h>", public, "<cassert>", public ] },
|
||||||
|
{ include: [ "<complex.h>", public, "<ccomplex>", public ] },
|
||||||
|
{ include: [ "<ctype.h>", public, "<cctype>", public ] },
|
||||||
|
{ include: [ "<errno.h>", public, "<cerrno>", public ] },
|
||||||
|
{ include: [ "<fenv.h>", public, "<cfenv>", public ] },
|
||||||
|
{ include: [ "<float.h>", public, "<cfloat>", public ] },
|
||||||
|
{ include: [ "<inttypes.h>", public, "<cinttypes>", public ] },
|
||||||
|
{ include: [ "<iso646.h>", public, "<ciso646>", public ] },
|
||||||
|
{ include: [ "<limits.h>", public, "<climits>", public ] },
|
||||||
|
{ include: [ "<locale.h>", public, "<clocale>", public ] },
|
||||||
|
{ include: [ "<math.h>", public, "<cmath>", public ] },
|
||||||
|
{ include: [ "<setjmp.h>", public, "<csetjmp>", public ] },
|
||||||
|
{ include: [ "<signal.h>", public, "<csignal>", public ] },
|
||||||
|
{ include: [ "<stdalign.h>", public, "<cstdalign>", public ] },
|
||||||
|
{ include: [ "<stdarg.h>", public, "<cstdarg>", public ] },
|
||||||
|
{ include: [ "<stdbool.h>", public, "<cstdbool>", public ] },
|
||||||
|
{ include: [ "<stddef.h>", public, "<cstddef>", public ] },
|
||||||
|
{ include: [ "<stdint.h>", public, "<cstdint>", public ] },
|
||||||
|
{ include: [ "<stdio.h>", public, "<cstdio>", public ] },
|
||||||
|
{ include: [ "<stdlib.h>", public, "<cstdlib>", public ] },
|
||||||
|
{ include: [ "<string.h>", public, "<cstring>", public ] },
|
||||||
|
{ include: [ "<tgmath.h>", public, "<ctgmath>", public ] },
|
||||||
|
{ include: [ "<time.h>", public, "<ctime>", public ] },
|
||||||
|
{ include: [ "<uchar.h>", public, "<cuchar>", public ] },
|
||||||
|
{ include: [ "<wchar.h>", public, "<cwchar>", public ] },
|
||||||
|
{ include: [ "<wctype.h>", public, "<cwctype>", public ] },
|
||||||
|
]
|
Loading…
Reference in New Issue