Skip to content

Commit 4429133

Browse files
author
redi
committed
Avoid redundant runtime checks in std::visit
Calling std::get will check some static assertions and also do a runtime check for a valid index before calling __detail::__variant::__get. The std::visit function already handles the case where any variant has an invalid index, so __get can be used directly in __visit_invoke. * include/std/variant (__gen_vtable_impl::__visit_invoke): Call __get directly instead of get, as caller ensures correct index is used. (holds_alternative, get, get_if): Remove redundant inline specifiers. (_VARIANT_RELATION_FUNCTION_TEMPLATE): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264786 138bc75d-0d04-0410-961f-82ee72b054a4
1 parent 28c3ce2 commit 4429133

File tree

2 files changed

+23
-18
lines changed

2 files changed

+23
-18
lines changed

libstdc++-v3/ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
2018-10-02 Jonathan Wakely <jwakely@redhat.com>
2+
3+
* include/std/variant (__gen_vtable_impl::__visit_invoke): Call __get
4+
directly instead of get, as caller ensures correct index is used.
5+
(holds_alternative, get, get_if): Remove redundant inline specifiers.
6+
(_VARIANT_RELATION_FUNCTION_TEMPLATE): Likewise.
7+
18
2018-10-02 Joseph Myers <joseph@codesourcery.com>
29

310
* testsuite/lib/libstdc++.exp (libstdc++_init): Use

libstdc++-v3/include/std/variant

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -811,9 +811,8 @@ namespace __variant
811811
{
812812
using _Alternative = variant_alternative_t<__index, _Next>;
813813
__element = __gen_vtable_impl<
814-
remove_reference_t<
815-
decltype(__element)>, tuple<_Variants...>,
816-
std::index_sequence<__indices..., __index>>::_S_apply();
814+
remove_reference_t<decltype(__element)>, tuple<_Variants...>,
815+
std::index_sequence<__indices..., __index>>::_S_apply();
817816
}
818817
};
819818

@@ -826,11 +825,11 @@ namespace __variant
826825
using _Array_type =
827826
_Multi_array<_Result_type (*)(_Visitor&&, _Variants...)>;
828827

829-
decltype(auto)
830-
static constexpr __visit_invoke(_Visitor&& __visitor, _Variants... __vars)
828+
static constexpr decltype(auto)
829+
__visit_invoke(_Visitor&& __visitor, _Variants... __vars)
831830
{
832831
return std::__invoke(std::forward<_Visitor>(__visitor),
833-
std::get<__indices>(std::forward<_Variants>(__vars))...);
832+
__variant::__get<__indices>(std::forward<_Variants>(__vars))...);
834833
}
835834

836835
static constexpr auto
@@ -871,16 +870,16 @@ namespace __variant
871870
} // namespace __detail
872871

873872
template<typename _Tp, typename... _Types>
874-
inline constexpr bool holds_alternative(const variant<_Types...>& __v)
875-
noexcept
873+
constexpr bool
874+
holds_alternative(const variant<_Types...>& __v) noexcept
876875
{
877876
static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
878877
"T should occur for exactly once in alternatives");
879878
return __v.index() == __detail::__variant::__index_of_v<_Tp, _Types...>;
880879
}
881880

882881
template<typename _Tp, typename... _Types>
883-
constexpr inline _Tp& get(variant<_Types...>& __v)
882+
constexpr _Tp& get(variant<_Types...>& __v)
884883
{
885884
static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
886885
"T should occur for exactly once in alternatives");
@@ -889,7 +888,7 @@ namespace __variant
889888
}
890889

891890
template<typename _Tp, typename... _Types>
892-
constexpr inline _Tp&& get(variant<_Types...>&& __v)
891+
constexpr _Tp&& get(variant<_Types...>&& __v)
893892
{
894893
static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
895894
"T should occur for exactly once in alternatives");
@@ -899,7 +898,7 @@ namespace __variant
899898
}
900899

901900
template<typename _Tp, typename... _Types>
902-
constexpr inline const _Tp& get(const variant<_Types...>& __v)
901+
constexpr const _Tp& get(const variant<_Types...>& __v)
903902
{
904903
static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
905904
"T should occur for exactly once in alternatives");
@@ -908,7 +907,7 @@ namespace __variant
908907
}
909908

910909
template<typename _Tp, typename... _Types>
911-
constexpr inline const _Tp&& get(const variant<_Types...>&& __v)
910+
constexpr const _Tp&& get(const variant<_Types...>&& __v)
912911
{
913912
static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
914913
"T should occur for exactly once in alternatives");
@@ -918,8 +917,7 @@ namespace __variant
918917
}
919918

920919
template<size_t _Np, typename... _Types>
921-
constexpr inline
922-
add_pointer_t<variant_alternative_t<_Np, variant<_Types...>>>
920+
constexpr add_pointer_t<variant_alternative_t<_Np, variant<_Types...>>>
923921
get_if(variant<_Types...>* __ptr) noexcept
924922
{
925923
using _Alternative_type = variant_alternative_t<_Np, variant<_Types...>>;
@@ -932,7 +930,7 @@ namespace __variant
932930
}
933931

934932
template<size_t _Np, typename... _Types>
935-
constexpr inline
933+
constexpr
936934
add_pointer_t<const variant_alternative_t<_Np, variant<_Types...>>>
937935
get_if(const variant<_Types...>* __ptr) noexcept
938936
{
@@ -946,7 +944,7 @@ namespace __variant
946944
}
947945

948946
template<typename _Tp, typename... _Types>
949-
constexpr inline add_pointer_t<_Tp>
947+
constexpr add_pointer_t<_Tp>
950948
get_if(variant<_Types...>* __ptr) noexcept
951949
{
952950
static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
@@ -957,7 +955,7 @@ namespace __variant
957955
}
958956

959957
template<typename _Tp, typename... _Types>
960-
constexpr inline add_pointer_t<const _Tp>
958+
constexpr add_pointer_t<const _Tp>
961959
get_if(const variant<_Types...>* __ptr)
962960
noexcept
963961
{
@@ -1277,7 +1275,7 @@ namespace __variant
12771275
{ &__detail::__variant::__erased_##__NAME< \
12781276
const variant&, __indices>... }; \
12791277
template<size_t... __indices> \
1280-
constexpr inline bool \
1278+
constexpr bool \
12811279
_M_##__NAME(const variant& __rhs, \
12821280
std::index_sequence<__indices...>) const \
12831281
{ \

0 commit comments

Comments
 (0)