From 14421d43f8eafc7ef36db9d51362a9b6372e6bb5 Mon Sep 17 00:00:00 2001 From: David Hebbeker Date: Wed, 21 Dec 2022 10:22:17 +0100 Subject: [PATCH] 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(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. --- include/etl/private/variant_legacy.h | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/include/etl/private/variant_legacy.h b/include/etl/private/variant_legacy.h index 9302a782..09c1897b 100644 --- a/include/etl/private/variant_legacy.h +++ b/include/etl/private/variant_legacy.h @@ -954,22 +954,22 @@ namespace etl return get::type>(variant); } -#define ETL_GEN_LEGACY_VISIT(VISITQUAL, VARIANTQUAL) \ - template \ - static TReturn visit(TVisitor VISITQUAL visitor, TVariant VARIANTQUAL variant) \ - { \ - switch (variant.index()) \ - { \ - case 0: return static_cast(visitor(get<0>(variant))); \ - case 1: return static_cast(visitor(get<1>(variant))); \ - case 2: return static_cast(visitor(get<2>(variant))); \ - case 3: return static_cast(visitor(get<3>(variant))); \ - case 4: return static_cast(visitor(get<4>(variant))); \ - case 5: return static_cast(visitor(get<5>(variant))); \ - case 6: return static_cast(visitor(get<6>(variant))); \ - case 7: return static_cast(visitor(get<7>(variant))); \ - default: ETL_ASSERT(false, ETL_ERROR(bad_variant_access)); \ - } \ +#define ETL_GEN_LEGACY_VISIT(VISITQUAL, VARIANTQUAL) \ + template \ + static TReturn visit(TVisitor VISITQUAL visitor, TVariant VARIANTQUAL variant) \ + { \ + switch (variant.index()) \ + { \ + case 0: return static_cast(visitor(get<0>(variant))); \ + case 1: return static_cast(visitor(get<1>(variant))); \ + case 2: return static_cast(visitor(get<2>(variant))); \ + case 3: return static_cast(visitor(get<3>(variant))); \ + case 4: return static_cast(visitor(get<4>(variant))); \ + case 5: return static_cast(visitor(get<5>(variant))); \ + case 6: return static_cast(visitor(get<6>(variant))); \ + case 7: return static_cast(visitor(get<7>(variant))); \ + default: ETL_ASSERT_FAIL_AND_RETURN_VALUE(ETL_ERROR(bad_variant_access), TReturn()); \ + } \ } ETL_GEN_LEGACY_VISIT(&, &)