Skip to content

Commit

Permalink
[libc++] Add various missing _LIBCPP_HIDE_FROM_ABI
Browse files Browse the repository at this point in the history
Those were spotted when a project unintentionally started exporting
these symbols from its ABI just by using the libc++ headers.

Differential Revision: https://reviews.llvm.org/D126496
  • Loading branch information
ldionne committed May 27, 2022
1 parent a5d7e2a commit c358d98
Show file tree
Hide file tree
Showing 3 changed files with 161 additions and 89 deletions.
29 changes: 20 additions & 9 deletions libcxx/include/__filesystem/directory_iterator.h
Expand Up @@ -44,25 +44,31 @@ class directory_iterator {

public:
//ctor & dtor
_LIBCPP_HIDE_FROM_ABI
directory_iterator() noexcept {}

_LIBCPP_HIDE_FROM_ABI
explicit directory_iterator(const path& __p)
: directory_iterator(__p, nullptr) {}

_LIBCPP_HIDE_FROM_ABI
directory_iterator(const path& __p, directory_options __opts)
: directory_iterator(__p, nullptr, __opts) {}

_LIBCPP_HIDE_FROM_ABI
directory_iterator(const path& __p, error_code& __ec)
: directory_iterator(__p, &__ec) {}

_LIBCPP_HIDE_FROM_ABI
directory_iterator(const path& __p, directory_options __opts,
error_code& __ec)
: directory_iterator(__p, &__ec, __opts) {}

directory_iterator(const directory_iterator&) = default;
directory_iterator(directory_iterator&&) = default;
directory_iterator& operator=(const directory_iterator&) = default;
_LIBCPP_HIDE_FROM_ABI directory_iterator(const directory_iterator&) = default;
_LIBCPP_HIDE_FROM_ABI directory_iterator(directory_iterator&&) = default;
_LIBCPP_HIDE_FROM_ABI directory_iterator& operator=(const directory_iterator&) = default;

_LIBCPP_HIDE_FROM_ABI
directory_iterator& operator=(directory_iterator&& __o) noexcept {
// non-default implementation provided to support self-move assign.
if (this != &__o) {
Expand All @@ -71,27 +77,32 @@ class directory_iterator {
return *this;
}

~directory_iterator() = default;
_LIBCPP_HIDE_FROM_ABI ~directory_iterator() = default;

_LIBCPP_HIDE_FROM_ABI
const directory_entry& operator*() const {
_LIBCPP_ASSERT(__imp_, "The end iterator cannot be dereferenced");
return __dereference();
}

_LIBCPP_HIDE_FROM_ABI
const directory_entry* operator->() const { return &**this; }

_LIBCPP_HIDE_FROM_ABI
directory_iterator& operator++() { return __increment(); }

_LIBCPP_HIDE_FROM_ABI
__dir_element_proxy operator++(int) {
__dir_element_proxy __p(**this);
__increment();
return __p;
}

_LIBCPP_HIDE_FROM_ABI
directory_iterator& increment(error_code& __ec) { return __increment(&__ec); }

private:
inline _LIBCPP_INLINE_VISIBILITY friend bool
inline _LIBCPP_HIDE_FROM_ABI friend bool
operator==(const directory_iterator& __lhs,
const directory_iterator& __rhs) noexcept;

Expand All @@ -110,25 +121,25 @@ class directory_iterator {
shared_ptr<__dir_stream> __imp_;
};

inline _LIBCPP_INLINE_VISIBILITY bool
inline _LIBCPP_HIDE_FROM_ABI bool
operator==(const directory_iterator& __lhs,
const directory_iterator& __rhs) noexcept {
return __lhs.__imp_ == __rhs.__imp_;
}

inline _LIBCPP_INLINE_VISIBILITY bool
inline _LIBCPP_HIDE_FROM_ABI bool
operator!=(const directory_iterator& __lhs,
const directory_iterator& __rhs) noexcept {
return !(__lhs == __rhs);
}

// enable directory_iterator range-based for statements
inline _LIBCPP_INLINE_VISIBILITY directory_iterator
inline _LIBCPP_HIDE_FROM_ABI directory_iterator
begin(directory_iterator __iter) noexcept {
return __iter;
}

inline _LIBCPP_INLINE_VISIBILITY directory_iterator
inline _LIBCPP_HIDE_FROM_ABI directory_iterator
end(directory_iterator) noexcept {
return directory_iterator();
}
Expand Down

0 comments on commit c358d98

Please sign in to comment.