From 1a357c61e8bc75d6b1a6b8cc88142fbed25a70e9 Mon Sep 17 00:00:00 2001 From: acki-m Date: Fri, 14 Sep 2018 08:50:00 +0200 Subject: [PATCH] Bugfix clang virtual override warning (#192) * fixed missing use of 'override' in classes that use RTTR_ENABLE following test case: struct s_base { virtual ~s_base() = default; // always use virtual dtor in base class RTTR_ENABLE() }; struct s_derived : s_base { ~s_derived() override = default; // Clang options require "override" on inherited virtual functions RTTR_ENABLE(s_base) }; clang warning is: 'get_derived_info' overrides a member function but is not marked 'override' [-Werror,-Winconsistent-missing-override] The fix is to disable the warning for the usage of RTTR_ENABLE only * add test case code in unit test for warning of override inconsistency * added missing quotes --- src/rttr/detail/base/core_prerequisites.h | 21 +++++++++++++++++-- src/rttr/rttr_enable.h | 2 ++ .../property/property_class_inheritance.cpp | 4 ++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/rttr/detail/base/core_prerequisites.h b/src/rttr/detail/base/core_prerequisites.h index d9fc0a22..f60d91c3 100644 --- a/src/rttr/detail/base/core_prerequisites.h +++ b/src/rttr/detail/base/core_prerequisites.h @@ -261,15 +261,21 @@ namespace rttr # define RTTR_BEGIN_DISABLE_CONDITIONAL_EXPR_WARNING # define RTTR_END_DISABLE_CONDITIONAL_EXPR_WARNING #if RTTR_COMP_VER >= 700 - #define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wnoexcept-type\"") #define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING _Pragma ("GCC diagnostic pop") #else - #define RTTR_BEGIN_DISABLE_EXCEPT_TYPE_WARNING #define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING +#endif +#if RTTR_COMP_VER >= 510 +# define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wsuggest-override\"") +# define RTTR_END_DISABLE_OVERRIDE_WARNING _Pragma ("GCC diagnostic pop") +# else +# define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING +# define RTTR_END_DISABLE_OVERRIDE_WARNING #endif # define RTTR_DECLARE_PLUGIN_CTOR __attribute__((constructor)) @@ -298,6 +304,15 @@ namespace rttr # define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING #endif +#if defined(__has_warning) && __has_warning("-Winconsistent-missing-override") +# define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING _Pragma ("clang diagnostic push") \ + _Pragma ("clang diagnostic ignored \"-Winconsistent-missing-override\"") +# define RTTR_END_DISABLE_OVERRIDE_WARNING _Pragma ("clang diagnostic pop") +#else +# define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING +# define RTTR_END_DISABLE_OVERRIDE_WARNING +#endif + # define RTTR_DECLARE_PLUGIN_CTOR __attribute__((__constructor__)) # define RTTR_DECLARE_PLUGIN_DTOR __attribute__((__destructor__)) @@ -315,6 +330,8 @@ namespace rttr # define RTTR_END_DISABLE_EXCEPT_TYPE_WARNING # define RTTR_DECLARE_PLUGIN_CTOR # define RTTR_DECLARE_PLUGIN_DTOR +# define RTTR_BEGIN_DISABLE_OVERRIDE_WARNING +# define RTTR_END_DISABLE_OVERRIDE_WARNING #else # pragma message("WARNING: unknown compiler, don't know how to disable deprecated warnings") diff --git a/src/rttr/rttr_enable.h b/src/rttr/rttr_enable.h index 1bd2e774..93d0fadd 100644 --- a/src/rttr/rttr_enable.h +++ b/src/rttr/rttr_enable.h @@ -81,10 +81,12 @@ #define RTTR_ENABLE(...) \ public:\ +RTTR_BEGIN_DISABLE_OVERRIDE_WARNING \ virtual RTTR_INLINE rttr::type get_type() const { return rttr::detail::get_type_from_instance(this); } \ virtual RTTR_INLINE void* get_ptr() { return reinterpret_cast(this); } \ virtual RTTR_INLINE rttr::detail::derived_info get_derived_info() { return {reinterpret_cast(this), rttr::detail::get_type_from_instance(this)}; } \ using base_class_list = TYPE_LIST(__VA_ARGS__); \ +RTTR_END_DISABLE_OVERRIDE_WARNING \ private: #endif // DOXYGEN diff --git a/src/unit_tests/property/property_class_inheritance.cpp b/src/unit_tests/property/property_class_inheritance.cpp index 3618ac5c..e10c795c 100644 --- a/src/unit_tests/property/property_class_inheritance.cpp +++ b/src/unit_tests/property/property_class_inheritance.cpp @@ -56,6 +56,7 @@ struct left : virtual top { left() : _p2(true){} + ~left() override = default; bool _p2; RTTR_ENABLE(top) @@ -67,6 +68,7 @@ struct right : virtual top { right() : _p3(true){} + ~right() override = default; bool _p3; RTTR_ENABLE(top) @@ -77,6 +79,7 @@ struct right : virtual top struct right_2 { virtual ~right_2() {} + right_2() : _p4(true){} bool _p4; RTTR_ENABLE() @@ -87,6 +90,7 @@ struct right_2 struct bottom : left, right, right_2 { bottom() : _p5(23.0){} + ~bottom() override = default; double _p5;