From 4f411c66a92298bb4dfd1ab6b1d02d97af8453bb Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 3 May 2026 22:49:02 +0200 Subject: [PATCH] Remove dead code (#1427) Removing private class members, code unused by ETL in "private" namespaces, code unreachable via preprocessor guards (C++11 inside C++03). For code still to be kept, even though unused at first sight, add tests. --- include/etl/algorithm.h | 20 -------------- include/etl/basic_string.h | 18 ++----------- include/etl/callback_timer.h | 20 +++----------- include/etl/callback_timer_atomic.h | 20 +++----------- include/etl/callback_timer_interrupt.h | 20 +++----------- include/etl/callback_timer_locked.h | 20 +++----------- include/etl/deque.h | 26 ------------------- include/etl/flat_map.h | 20 -------------- include/etl/memory.h | 20 +++++++------- include/etl/message_timer.h | 20 +++----------- include/etl/message_timer_atomic.h | 20 +++----------- include/etl/message_timer_interrupt.h | 20 +++----------- include/etl/message_timer_locked.h | 20 +++----------- include/etl/ranges.h | 14 ---------- include/etl/vector.h | 11 -------- test/test_memory.cpp | 26 +++++++++++++++++++ test/test_ranges.cpp | 36 ++++++++++++++++++++++++++ 17 files changed, 106 insertions(+), 245 deletions(-) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index b1d570e2..577ea394 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -91,26 +91,6 @@ namespace etl template ETL_CONSTEXPR14 void insertion_sort(TIterator first, TIterator last, TCompare compare); - class algorithm_exception : public etl::exception - { - public: - - algorithm_exception(string_type reason_, string_type file_name_, numeric_type line_number_) - : exception(reason_, file_name_, line_number_) - { - } - }; - - class algorithm_error : public algorithm_exception - { - public: - - algorithm_error(string_type file_name_, numeric_type line_number_) - : algorithm_exception(ETL_ERROR_TEXT("algorithm:error", ETL_ALGORITHM_FILE_ID"A"), file_name_, line_number_) - { - } - }; - } // namespace etl //***************************************************************************** diff --git a/include/etl/basic_string.h b/include/etl/basic_string.h index 1a38cc99..4b834c74 100644 --- a/include/etl/basic_string.h +++ b/include/etl/basic_string.h @@ -93,20 +93,6 @@ namespace etl } }; - //*************************************************************************** - ///\ingroup string - /// String empty exception. - //*************************************************************************** - class string_empty : public etl::string_exception - { - public: - - string_empty(string_type file_name_, numeric_type line_number_) - : string_exception(ETL_ERROR_TEXT("string:empty", ETL_BASIC_STRING_FILE_ID"A"), file_name_, line_number_) - { - } - }; - //*************************************************************************** ///\ingroup string /// String out of bounds exception. @@ -2742,6 +2728,7 @@ namespace etl iterator>::type copy_characters(TIterator1 from, size_t n, iterator to) { +#include "etl/private/diagnostic_stringop_overflow_push.h" size_t count = 0; while (count != n) @@ -2750,6 +2737,7 @@ namespace etl ++count; } +#include "etl/private/diagnostic_pop.h" return to; } @@ -3218,8 +3206,6 @@ namespace etl #endif } // namespace etl -#undef ETL_USING_WCHAR_T_H - #include "private/minmax_pop.h" #endif diff --git a/include/etl/callback_timer.h b/include/etl/callback_timer.h index 0b3da8ba..2cc94651 100644 --- a/include/etl/callback_timer.h +++ b/include/etl/callback_timer.h @@ -629,7 +629,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -758,22 +757,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -788,16 +778,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/callback_timer_atomic.h b/include/etl/callback_timer_atomic.h index 0aba1f97..a95c191f 100644 --- a/include/etl/callback_timer_atomic.h +++ b/include/etl/callback_timer_atomic.h @@ -487,7 +487,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -616,22 +615,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -646,16 +636,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/callback_timer_interrupt.h b/include/etl/callback_timer_interrupt.h index 3522bd22..59cdf845 100644 --- a/include/etl/callback_timer_interrupt.h +++ b/include/etl/callback_timer_interrupt.h @@ -487,7 +487,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -616,22 +615,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -646,16 +636,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/callback_timer_locked.h b/include/etl/callback_timer_locked.h index 4c53f259..85119025 100644 --- a/include/etl/callback_timer_locked.h +++ b/include/etl/callback_timer_locked.h @@ -460,7 +460,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -589,22 +588,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -619,16 +609,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/deque.h b/include/etl/deque.h index 888ac06a..697436fc 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -462,19 +462,6 @@ namespace etl private: - //*************************************************** - difference_type distance(difference_type firstIndex, difference_type index_) const - { - if (index_ < firstIndex) - { - return static_cast(p_deque->Buffer_Size) + index_ - firstIndex; - } - else - { - return index_ - firstIndex; - } - } - //*************************************************** iterator(difference_type index_, ideque& the_deque, pointer p_buffer_) : index(index_) @@ -721,19 +708,6 @@ namespace etl private: - //*************************************************** - difference_type distance(difference_type firstIndex, difference_type index_) const - { - if (index_ < firstIndex) - { - return static_cast(p_deque->Buffer_Size) + index_ - firstIndex; - } - else - { - return index_ - firstIndex; - } - } - //*************************************************** const_iterator(difference_type index_, ideque& the_deque, pointer p_buffer_) : index(index_) diff --git a/include/etl/flat_map.h b/include/etl/flat_map.h index 8e2cd39f..a9188642 100644 --- a/include/etl/flat_map.h +++ b/include/etl/flat_map.h @@ -100,26 +100,6 @@ namespace etl private: - //********************************************************************* - /// How to compare elements and keys. - //********************************************************************* - class compare - { - public: - - bool operator()(const value_type& element, key_type key) const - { - return comp(element.first, key); - } - - bool operator()(key_type key, const value_type& element) const - { - return comp(key, element.first); - } - - key_compare comp; - }; - public: //********************************************************************* diff --git a/include/etl/memory.h b/include/etl/memory.h index e4301260..c25af960 100644 --- a/include/etl/memory.h +++ b/include/etl/memory.h @@ -795,12 +795,8 @@ namespace etl template TOutputIterator uninitialized_move_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin) { - // Move not supported. Defer to copy. - #if ETL_USING_CPP11 - return std::uninitialized_copy_n(i_begin, n, o_begin); - #else + // Move not supported. Defer to copy. return etl::uninitialized_copy_n(i_begin, n, o_begin); - #endif } //***************************************************************************** @@ -814,12 +810,8 @@ namespace etl { count += TCounter(n); - // Move not supported. Defer to copy. - #if ETL_USING_CPP11 - return std::uninitialized_copy_n(i_begin, n, o_begin); - #else + // Move not supported. Defer to copy. return etl::uninitialized_copy_n(i_begin, n, o_begin); - #endif } #endif @@ -2643,6 +2635,14 @@ namespace etl { *p++ = 0; } + + // Prevent the compiler from optimising away the volatile stores + // as dead stores (observed with GCC -O3 in C++23 mode). +#if defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_CLANG) + __asm__ __volatile__("" : : : "memory"); +#elif defined(ETL_COMPILER_MICROSOFT) + _ReadWriteBarrier(); +#endif } //***************************************************************************** diff --git a/include/etl/message_timer.h b/include/etl/message_timer.h index 378ff36f..a6d44a33 100644 --- a/include/etl/message_timer.h +++ b/include/etl/message_timer.h @@ -157,7 +157,6 @@ namespace etl list(etl::message_timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -286,22 +285,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -316,16 +306,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; etl::message_timer_data* const ptimers; }; diff --git a/include/etl/message_timer_atomic.h b/include/etl/message_timer_atomic.h index 584cc491..93e328c3 100644 --- a/include/etl/message_timer_atomic.h +++ b/include/etl/message_timer_atomic.h @@ -466,7 +466,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -595,22 +594,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -625,16 +615,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/message_timer_interrupt.h b/include/etl/message_timer_interrupt.h index acb3c344..5aaeb424 100644 --- a/include/etl/message_timer_interrupt.h +++ b/include/etl/message_timer_interrupt.h @@ -472,7 +472,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -601,22 +600,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -631,16 +621,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/message_timer_locked.h b/include/etl/message_timer_locked.h index 8826ad5e..4eb689ee 100644 --- a/include/etl/message_timer_locked.h +++ b/include/etl/message_timer_locked.h @@ -480,7 +480,6 @@ namespace etl timer_list(timer_data* ptimers_) : head(etl::timer::id::NO_TIMER) , tail(etl::timer::id::NO_TIMER) - , current(etl::timer::id::NO_TIMER) , ptimers(ptimers_) { } @@ -609,22 +608,13 @@ namespace etl //******************************* etl::timer::id::type begin() { - current = head; - return current; - } - - //******************************* - etl::timer::id::type previous(etl::timer::id::type last) - { - current = ptimers[last].previous; - return current; + return head; } //******************************* etl::timer::id::type next(etl::timer::id::type last) { - current = ptimers[last].next; - return current; + return ptimers[last].next; } //******************************* @@ -639,16 +629,14 @@ namespace etl timer.next = etl::timer::id::NO_TIMER; } - head = etl::timer::id::NO_TIMER; - tail = etl::timer::id::NO_TIMER; - current = etl::timer::id::NO_TIMER; + head = etl::timer::id::NO_TIMER; + tail = etl::timer::id::NO_TIMER; } private: etl::timer::id::type head; etl::timer::id::type tail; - etl::timer::id::type current; timer_data* const ptimers; }; diff --git a/include/etl/ranges.h b/include/etl/ranges.h index 8e875b83..5fd8b6fe 100644 --- a/include/etl/ranges.h +++ b/include/etl/ranges.h @@ -3639,20 +3639,6 @@ namespace etl template concat_view(Ranges&&...) -> concat_view...>; - struct concat_range_adapter_closure : public range_adapter_closure - { - template - using target_view_type = concat_view; - - constexpr concat_range_adapter_closure() = default; - - template - constexpr auto operator()(Ranges&&... r) const - { - return concat_view(views::all(etl::forward(r))...); - } - }; - namespace views { namespace private_views diff --git a/include/etl/vector.h b/include/etl/vector.h index ebdc5d1e..75afe585 100644 --- a/include/etl/vector.h +++ b/include/etl/vector.h @@ -1125,17 +1125,6 @@ namespace etl private: - //********************************************************************* - /// Create a new element with a default value at the back. - //********************************************************************* - void create_back() - { - etl::create_value_at(p_end); - ETL_INCREMENT_DEBUG_COUNT; - - ++p_end; - } - //********************************************************************* /// Create a new element with a value at the back //********************************************************************* diff --git a/test/test_memory.cpp b/test/test_memory.cpp index eeddc426..e0e457c6 100644 --- a/test/test_memory.cpp +++ b/test/test_memory.cpp @@ -2980,5 +2980,31 @@ namespace CHECK_EQUAL(0, relocatable_t::destructor_count); } #endif + + //************************************************************************* + TEST(test_wipe_on_destruct) + { + struct Data : public etl::wipe_on_destruct + { + uint32_t d1; + uint32_t d2; + char d3; + }; + + alignas(Data) unsigned char buffer[sizeof(Data)] = {0}; + + // Construct a Data object in the buffer with known non-zero values. + Data* p = new (buffer) Data(); + p->d1 = 0x12345678UL; + p->d2 = 0xAABBCCDDUL; + p->d3 = char(0xEE); + + // Destroy the object; wipe_on_destruct should zero the memory. + p->~Data(); + + // Verify the memory occupied by the object has been cleared. + unsigned char zeroes[sizeof(Data)] = {0}; + CHECK(memcmp(buffer, zeroes, sizeof(Data)) == 0); + } } } // namespace diff --git a/test/test_ranges.cpp b/test/test_ranges.cpp index 01b20c95..3f4b4e00 100644 --- a/test/test_ranges.cpp +++ b/test/test_ranges.cpp @@ -3384,6 +3384,42 @@ namespace CHECK(it == ev.end()); } + //************************************************************************* + TEST(test_ranges_keys_view_alias) + { + std::vector> v = {{10, 1.1}, {20, 2.2}, {30, 3.3}}; + + using range_t = etl::ranges::views::all_t; + etl::ranges::keys_view kv(etl::ranges::views::all(v)); + + auto it = kv.begin(); + CHECK_EQUAL(10, *it); + ++it; + CHECK_EQUAL(20, *it); + ++it; + CHECK_EQUAL(30, *it); + ++it; + CHECK(it == kv.end()); + } + + //************************************************************************* + TEST(test_ranges_values_view_alias) + { + std::vector> v = {{10, 1.1}, {20, 2.2}, {30, 3.3}}; + + using range_t = etl::ranges::views::all_t; + etl::ranges::values_view vv(etl::ranges::views::all(v)); + + auto it = vv.begin(); + CHECK_CLOSE(1.1, *it, 0.001); + ++it; + CHECK_CLOSE(2.2, *it, 0.001); + ++it; + CHECK_CLOSE(3.3, *it, 0.001); + ++it; + CHECK(it == vv.end()); + } + //************************************************************************* TEST(test_ranges_views_keys) {