mirror of
https://github.com/ETLCPP/etl.git
synced 2026-06-29 05:48:44 +08:00
Avoid 'missing return statement at end of non-void function' in etl::visit<>(). (#645)
* Avoid 'missing return statement at end of non-void function' in `etl::visit<>()`. For some definitions of `ETL_ASSERT()` there may be no return statement in case of an invalid type. This results in undefined behavior. Warning[Pe940]: missing return statement at end of non-void function "etl::visit<TReturn,TVisitor,TVariant>(TVisitor &, TVariant const &) include\etl\private\variant_legacy.h 976 * Use more self-explaining code. Substitute ET_ASSERT() and return by dedicated macro. This moves the responsibility of how to handle errors to the dedicated place.
This commit is contained in:
parent
d8cc108c59
commit
14421d43f8
@ -954,22 +954,22 @@ namespace etl
|
||||
return get<typename variant_alternative<tIndex, TVariant>::type>(variant);
|
||||
}
|
||||
|
||||
#define ETL_GEN_LEGACY_VISIT(VISITQUAL, VARIANTQUAL) \
|
||||
template <typename TReturn, typename TVisitor, typename TVariant> \
|
||||
static TReturn visit(TVisitor VISITQUAL visitor, TVariant VARIANTQUAL variant) \
|
||||
{ \
|
||||
switch (variant.index()) \
|
||||
{ \
|
||||
case 0: return static_cast<TReturn>(visitor(get<0>(variant))); \
|
||||
case 1: return static_cast<TReturn>(visitor(get<1>(variant))); \
|
||||
case 2: return static_cast<TReturn>(visitor(get<2>(variant))); \
|
||||
case 3: return static_cast<TReturn>(visitor(get<3>(variant))); \
|
||||
case 4: return static_cast<TReturn>(visitor(get<4>(variant))); \
|
||||
case 5: return static_cast<TReturn>(visitor(get<5>(variant))); \
|
||||
case 6: return static_cast<TReturn>(visitor(get<6>(variant))); \
|
||||
case 7: return static_cast<TReturn>(visitor(get<7>(variant))); \
|
||||
default: ETL_ASSERT(false, ETL_ERROR(bad_variant_access)); \
|
||||
} \
|
||||
#define ETL_GEN_LEGACY_VISIT(VISITQUAL, VARIANTQUAL) \
|
||||
template <typename TReturn, typename TVisitor, typename TVariant> \
|
||||
static TReturn visit(TVisitor VISITQUAL visitor, TVariant VARIANTQUAL variant) \
|
||||
{ \
|
||||
switch (variant.index()) \
|
||||
{ \
|
||||
case 0: return static_cast<TReturn>(visitor(get<0>(variant))); \
|
||||
case 1: return static_cast<TReturn>(visitor(get<1>(variant))); \
|
||||
case 2: return static_cast<TReturn>(visitor(get<2>(variant))); \
|
||||
case 3: return static_cast<TReturn>(visitor(get<3>(variant))); \
|
||||
case 4: return static_cast<TReturn>(visitor(get<4>(variant))); \
|
||||
case 5: return static_cast<TReturn>(visitor(get<5>(variant))); \
|
||||
case 6: return static_cast<TReturn>(visitor(get<6>(variant))); \
|
||||
case 7: return static_cast<TReturn>(visitor(get<7>(variant))); \
|
||||
default: ETL_ASSERT_FAIL_AND_RETURN_VALUE(ETL_ERROR(bad_variant_access), TReturn()); \
|
||||
} \
|
||||
}
|
||||
|
||||
ETL_GEN_LEGACY_VISIT(&, &)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user