diff --git a/libuavcan/CMakeLists.txt b/libuavcan/CMakeLists.txt index 2a14b91b9d..a7cfc68123 100644 --- a/libuavcan/CMakeLists.txt +++ b/libuavcan/CMakeLists.txt @@ -123,8 +123,9 @@ if (DEBUG_BUILD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -pedantic -Wfloat-equal -Wconversion") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-conversion -Wcast-align -Wmissing-declarations -Wlogical-op") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wdouble-promotion -Wswitch-enum -Wtype-limits -Wno-error=array-bounds") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wzero-as-null-pointer-constant -Wnon-virtual-dtor -Woverloaded-virtual") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-promo") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wzero-as-null-pointer-constant -Wnon-virtual-dtor") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual -Wsign-promo -Wold-style-cast") + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++ -Wno-error=effc++") # Produces heaps of useless warnings set(cpp03_flags "-std=c++03 -Wno-variadic-macros -Wno-long-long -Wno-zero-as-null-pointer-constant") set(optim_flags "-O3 -DNDEBUG -g0") else () diff --git a/libuavcan/include/uavcan/marshal/array.hpp b/libuavcan/include/uavcan/marshal/array.hpp index 83c074d1ce..1e2508238c 100644 --- a/libuavcan/include/uavcan/marshal/array.hpp +++ b/libuavcan/include/uavcan/marshal/array.hpp @@ -761,7 +761,8 @@ public: * Members must be comparable via operator ==. */ template - typename EnableIfsize()) && sizeof((*((const R*)(0U)))[0]), bool>::Type + typename EnableIf(0))->size()) && + sizeof((*(reinterpret_cast(0)))[0]), bool>::Type operator==(const R& rhs) const { if (size() != rhs.size()) @@ -786,7 +787,8 @@ public: * Any container with size() and [] is acceptable. */ template - typename EnableIfsize()) && sizeof((*((const R*)(0U)))[0]), bool>::Type + typename EnableIf(0))->size()) && + sizeof((*(reinterpret_cast(0)))[0]), bool>::Type isClose(const R& rhs) const { if (size() != rhs.size()) @@ -1001,7 +1003,8 @@ public: * Note that matrix packing code uses @ref areClose() for comparison. */ template - typename EnableIfbegin()) && sizeof(((const R*)(0U))->size())>::Type + typename EnableIf(0))->begin()) && + sizeof((reinterpret_cast(0))->size())>::Type packSquareMatrix(const R& src_row_major) { if (src_row_major.size() == MaxSize) @@ -1057,7 +1060,8 @@ public: * Please refer to the specification to learn more about matrix packing. */ template - typename EnableIfbegin()) && sizeof(((const R*)(0U))->size())>::Type + typename EnableIf(0))->begin()) && + sizeof((reinterpret_cast(0))->size())>::Type unpackSquareMatrix(R& dst_row_major) const { if (dst_row_major.size() == MaxSize) diff --git a/libuavcan/include/uavcan/node/global_data_type_registry.hpp b/libuavcan/include/uavcan/node/global_data_type_registry.hpp index 63d0a1b174..0148ce0f50 100644 --- a/libuavcan/include/uavcan/node/global_data_type_registry.hpp +++ b/libuavcan/include/uavcan/node/global_data_type_registry.hpp @@ -211,7 +211,9 @@ GlobalDataTypeRegistry::RegistrationResult GlobalDataTypeRegistry::registerDataT { return RegistrationResultFrozen; } + static Entry entry; + { const RegistrationResult remove_res = remove(&entry); if (remove_res != RegistrationResultOk) @@ -219,7 +221,11 @@ GlobalDataTypeRegistry::RegistrationResult GlobalDataTypeRegistry::registerDataT return remove_res; } } - entry = Entry(DataTypeKind(Type::DataTypeKind), id, Type::getDataTypeSignature(), Type::getDataTypeFullName()); + + // We can't just overwrite the entry itself because it's noncopyable + entry.descriptor = DataTypeDescriptor(DataTypeKind(Type::DataTypeKind), id, + Type::getDataTypeSignature(), Type::getDataTypeFullName()); + { const RegistrationResult remove_res = remove(&entry); if (remove_res != RegistrationResultOk) diff --git a/libuavcan/include/uavcan/node/scheduler.hpp b/libuavcan/include/uavcan/node/scheduler.hpp index 8f008054a8..7973337983 100644 --- a/libuavcan/include/uavcan/node/scheduler.hpp +++ b/libuavcan/include/uavcan/node/scheduler.hpp @@ -14,7 +14,7 @@ namespace uavcan class UAVCAN_EXPORT Scheduler; -class UAVCAN_EXPORT DeadlineHandler : public LinkedListNode, Noncopyable +class UAVCAN_EXPORT DeadlineHandler : public LinkedListNode { MonotonicTime deadline_; diff --git a/libuavcan/include/uavcan/transport/dispatcher.hpp b/libuavcan/include/uavcan/transport/dispatcher.hpp index 5024bf80a6..53bc2e203f 100644 --- a/libuavcan/include/uavcan/transport/dispatcher.hpp +++ b/libuavcan/include/uavcan/transport/dispatcher.hpp @@ -24,7 +24,7 @@ class UAVCAN_EXPORT Dispatcher; /** * Inherit this class to receive notifications about all TX CAN frames that were transmitted with the loopback flag. */ -class UAVCAN_EXPORT LoopbackFrameListenerBase : public LinkedListNode, Noncopyable +class UAVCAN_EXPORT LoopbackFrameListenerBase : public LinkedListNode { Dispatcher& dispatcher_; diff --git a/libuavcan/include/uavcan/transport/transfer_listener.hpp b/libuavcan/include/uavcan/transport/transfer_listener.hpp index 72cb4151b6..d384e6ea7d 100644 --- a/libuavcan/include/uavcan/transport/transfer_listener.hpp +++ b/libuavcan/include/uavcan/transport/transfer_listener.hpp @@ -96,7 +96,7 @@ public: /** * Internal, refer to the transport dispatcher class. */ -class UAVCAN_EXPORT TransferListener : public LinkedListNode, Noncopyable +class UAVCAN_EXPORT TransferListener : public LinkedListNode { const DataTypeDescriptor& data_type_; TransferBufferManager bufmgr_; diff --git a/libuavcan/include/uavcan/util/linked_list.hpp b/libuavcan/include/uavcan/util/linked_list.hpp index a650b79489..915eb9c7e9 100644 --- a/libuavcan/include/uavcan/util/linked_list.hpp +++ b/libuavcan/include/uavcan/util/linked_list.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace uavcan { @@ -16,7 +17,7 @@ namespace uavcan * Classes that are supposed to be linked-listed should derive this. */ template -class UAVCAN_EXPORT LinkedListNode +class UAVCAN_EXPORT LinkedListNode : Noncopyable { T* next_; @@ -40,7 +41,7 @@ public: * Linked list root. */ template -class UAVCAN_EXPORT LinkedListRoot +class UAVCAN_EXPORT LinkedListRoot : Noncopyable { T* root_; diff --git a/libuavcan/include/uavcan/util/multiset.hpp b/libuavcan/include/uavcan/util/multiset.hpp index d04ec9028e..5813466c62 100644 --- a/libuavcan/include/uavcan/util/multiset.hpp +++ b/libuavcan/include/uavcan/util/multiset.hpp @@ -70,7 +70,7 @@ class UAVCAN_EXPORT Multiset : Noncopyable }; private: - struct Chunk : LinkedListNode, ::uavcan::Noncopyable + struct Chunk : LinkedListNode { enum { NumItems = (MemPoolBlockSize - sizeof(LinkedListNode)) / sizeof(Item) }; Item items[NumItems]; diff --git a/libuavcan/src/marshal/uc_bit_array_copy.cpp b/libuavcan/src/marshal/uc_bit_array_copy.cpp index 3512ffaafa..5657655a45 100644 --- a/libuavcan/src/marshal/uc_bit_array_copy.cpp +++ b/libuavcan/src/marshal/uc_bit_array_copy.cpp @@ -28,7 +28,7 @@ void bitarrayCopy(const unsigned char* src, std::size_t src_offset, std::size_t // The number of bits to copy const uint8_t max_offset = uavcan::max(src_bit_offset, dst_bit_offset); - const std::size_t copy_bits = uavcan::min(last_bit - src_offset, (std::size_t)(8U - max_offset)); + const std::size_t copy_bits = uavcan::min(last_bit - src_offset, std::size_t(8U - max_offset)); /* * The mask indicating which bits of dest to update: diff --git a/libuavcan/test/marshal/scalar_codec.cpp b/libuavcan/test/marshal/scalar_codec.cpp index ee816fdea4..e9012f71b5 100644 --- a/libuavcan/test/marshal/scalar_codec.cpp +++ b/libuavcan/test/marshal/scalar_codec.cpp @@ -22,18 +22,18 @@ TEST(ScalarCodec, Basic) /* * Encoding some variables */ - ASSERT_EQ(1, sc_wr.encode<12>((uint16_t)0xbeda)); // --> 0xeda - ASSERT_EQ(1, sc_wr.encode<1>((uint8_t)1)); - ASSERT_EQ(1, sc_wr.encode<1>((uint16_t)0)); - ASSERT_EQ(1, sc_wr.encode<4>((uint8_t)8)); - ASSERT_EQ(1, sc_wr.encode<32>((uint32_t)0xdeadbeef)); - ASSERT_EQ(1, sc_wr.encode<3>((int8_t)-1)); - ASSERT_EQ(1, sc_wr.encode<4>((int8_t)-6)); - ASSERT_EQ(1, sc_wr.encode<20>((int32_t)-123456)); + ASSERT_EQ(1, sc_wr.encode<12>(uint16_t(0xbeda))); // --> 0xeda + ASSERT_EQ(1, sc_wr.encode<1>(uint8_t(1))); + ASSERT_EQ(1, sc_wr.encode<1>(uint16_t(0))); + ASSERT_EQ(1, sc_wr.encode<4>(uint8_t(8))); + ASSERT_EQ(1, sc_wr.encode<32>(uint32_t(0xdeadbeef))); + ASSERT_EQ(1, sc_wr.encode<3>(int8_t(-1))); + ASSERT_EQ(1, sc_wr.encode<4>(int8_t(-6))); + ASSERT_EQ(1, sc_wr.encode<20>(int32_t(-123456))); ASSERT_EQ(1, sc_wr.encode<64>(std::numeric_limits::min())); ASSERT_EQ(1, sc_wr.encode<64>(std::numeric_limits::max())); - ASSERT_EQ(1, sc_wr.encode<15>((int16_t)-1)); - ASSERT_EQ(1, sc_wr.encode<2>((int16_t)-1)); + ASSERT_EQ(1, sc_wr.encode<15>(int16_t(-1))); + ASSERT_EQ(1, sc_wr.encode<2>(int16_t(-1))); ASSERT_EQ(1, sc_wr.encode<16>(std::numeric_limits::min())); ASSERT_EQ(1, sc_wr.encode<64>(std::numeric_limits::max())); // Total 302 bit (38 bytes) @@ -86,11 +86,11 @@ TEST(ScalarCodec, RepresentationCorrectness) uavcan::BitStream bs_wr(buf); uavcan::ScalarCodec sc_wr(bs_wr); - ASSERT_EQ(1, sc_wr.encode<12>((uint16_t)0xbeda)); // --> 0xeda - ASSERT_EQ(1, sc_wr.encode<3>((int8_t)-1)); - ASSERT_EQ(1, sc_wr.encode<4>((int8_t)-5)); - ASSERT_EQ(1, sc_wr.encode<2>((int16_t)-1)); - ASSERT_EQ(1, sc_wr.encode<4>((uint8_t)0x88)); // --> 8 + ASSERT_EQ(1, sc_wr.encode<12>(uint16_t(0xbeda))); // --> 0xeda + ASSERT_EQ(1, sc_wr.encode<3>(int8_t(-1))); + ASSERT_EQ(1, sc_wr.encode<4>(int8_t(-5))); + ASSERT_EQ(1, sc_wr.encode<2>(int16_t(-1))); + ASSERT_EQ(1, sc_wr.encode<4>(uint8_t(0x88))); // --> 8 // This representation was carefully crafted and triple checked: static const std::string REFERENCE = "11011010 11101111 01111100 00000000"; diff --git a/libuavcan/test/transport/frame.cpp b/libuavcan/test/transport/frame.cpp index 2cc8c5fe5b..522ad42f9d 100644 --- a/libuavcan/test/transport/frame.cpp +++ b/libuavcan/test/transport/frame.cpp @@ -37,7 +37,7 @@ TEST(Frame, MessageParseCompile) * Parse */ // Invalid CAN frames - ASSERT_FALSE(frame.parse(CanFrame(can_id | CanFrame::FlagRTR, (const uint8_t*)"", 0))); + ASSERT_FALSE(frame.parse(CanFrame(can_id | CanFrame::FlagRTR, reinterpret_cast(""), 0))); ASSERT_FALSE(frame.parse(makeCanFrame(can_id, payload_string, STD))); // Valid @@ -119,7 +119,7 @@ TEST(Frame, ServiceParseCompile) * Parse */ // Invalid CAN frames - ASSERT_FALSE(frame.parse(CanFrame(can_id | CanFrame::FlagRTR, (const uint8_t*)"", 0))); + ASSERT_FALSE(frame.parse(CanFrame(can_id | CanFrame::FlagRTR, reinterpret_cast(""), 0))); ASSERT_FALSE(frame.parse(makeCanFrame(can_id, payload_string, STD))); // Valid diff --git a/libuavcan/test/util/linked_list.cpp b/libuavcan/test/util/linked_list.cpp index 96c8be0e6d..8910bb8684 100644 --- a/libuavcan/test/util/linked_list.cpp +++ b/libuavcan/test/util/linked_list.cpp @@ -102,7 +102,11 @@ TEST(LinkedList, Basic) TEST(LinkedList, Sorting) { uavcan::LinkedListRoot root; - ListItem items[] = {0, 1, 2, 3, 4, 5}; + ListItem items[6]; + for (int i = 0; i < 6; i++) + { + items[i].value = i; + } EXPECT_EQ(0, root.getLength());