Skip to content

Commit 37c3bcb

Browse files
committed
Remove nullptr dereference in iterator
1 parent 0c39f3d commit 37c3bcb

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

libcxx/include/optional

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -629,26 +629,39 @@ public:
629629
// [optional.iterators], iterator support
630630
_LIBCPP_HIDE_FROM_ABI constexpr iterator begin() noexcept {
631631
auto& __derived_self = static_cast<optional<_Tp>&>(*this);
632+
auto __ptr = [&__derived_self]() {
633+
if constexpr (is_lvalue_reference_v<_Tp>) {
634+
return __derived_self.has_value() ? std::addressof(__derived_self.__get()) : nullptr;
635+
}
636+
return std::addressof(__derived_self.__get());
637+
}();
638+
632639
# ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
633640
return std::__make_bounded_iter(
634-
std::__wrap_iter<__pointer>(std::addressof(__derived_self.__get())),
635-
std::__wrap_iter<__pointer>(std::addressof(__derived_self.__get())),
636-
std::__wrap_iter<__pointer>(std::addressof(__derived_self.__get()) + (__derived_self.has_value() ? 1 : 0)));
641+
std::__wrap_iter<__pointer>(__ptr),
642+
std::__wrap_iter<__pointer>(__ptr),
643+
std::__wrap_iter<__pointer>(__ptr) + (__derived_self.has_value() ? 1 : 0)));
637644
# else
638-
return iterator(std::addressof(__derived_self.__get()));
645+
return iterator(__ptr);
639646
# endif
640647
}
641648

642649
_LIBCPP_HIDE_FROM_ABI constexpr const_iterator begin() const noexcept {
643650
auto& __derived_self = static_cast<const optional<_Tp>&>(*this);
651+
auto* __ptr = [&__derived_self]() {
652+
if constexpr (is_lvalue_reference_v<_Tp>) {
653+
return __derived_self.has_value() ? std::addressof(__derived_self.__get()) : nullptr;
654+
}
655+
return std::addressof(__derived_self.__get());
656+
}();
657+
644658
# ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_OPTIONAL
645659
return std::__make_bounded_iter(
646-
std::__wrap_iter<__const_pointer>(std::addressof(__derived_self.__get())),
647-
std::__wrap_iter<__const_pointer>(std::addressof(__derived_self.__get())),
648-
std::__wrap_iter<__const_pointer>(
649-
std::addressof(__derived_self.__get()) + (__derived_self.has_value() ? 1 : 0)));
660+
std::__wrap_iter<__const_pointer>(__ptr),
661+
std::__wrap_iter<__const_pointer>(__ptr),
662+
std::__wrap_iter<__const_pointer>(__ptr) + (__derived_self.has_value() ? 1 : 0)));
650663
# else
651-
return const_iterator(std::addressof(__derived_self.__get()));
664+
return const_iterator(__ptr);
652665
# endif
653666
}
654667

0 commit comments

Comments
 (0)