From: Richard Kreckel Date: Sat, 1 Oct 2016 22:45:11 +0000 (+0200) Subject: Suppress compiler warnings about inconsistent override. X-Git-Tag: release_1-7-1~1 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=commitdiff_plain;h=94f2d7ab9102d58550fa66d2718701571e87825d;p=ginac.git Suppress compiler warnings about inconsistent override. The introduction of the 'override' keyword in GiNaC in d5b86dd10 was deliberately incomplete: Duplication of code in macros was avoided. It turns out that some compilers (e.g. g++ -Wsuggest-override or clang++ -Wall) complain if the 'override' keyword is used inconsistently. Let's make this consistent now, even if it leads to the introduction of two more macros. --- diff --git a/ginac/print.h b/ginac/print.h index 675219b6..8f565675 100644 --- a/ginac/print.h +++ b/ginac/print.h @@ -59,24 +59,33 @@ public: }; -/** Macro for inclusion in the declaration of a print_context class. - * It declares some functions that are common to all classes derived - * from 'print_context' as well as all required stuff for the GiNaC - * registry. */ -#define GINAC_DECLARE_PRINT_CONTEXT(classname, supername) \ +/** Common part of GINAC_DECLARE_PRINT_CONTEXT_BASE and GINAC_DECLARE_PRINT_CONTEXT_DERIVED. */ +#define GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \ public: \ - typedef supername inherited; \ friend class function_options; \ friend class registered_class_options; \ -public: \ static const GiNaC::print_context_class_info &get_class_info_static(); \ + classname(); + +#define GINAC_DECLARE_PRINT_CONTEXT_BASE(classname) \ + GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \ virtual const GiNaC::print_context_class_info &get_class_info() const { return classname::get_class_info_static(); } \ virtual const char *class_name() const { return classname::get_class_info_static().options.get_name(); } \ - \ - classname(); \ virtual classname * duplicate() const { return new classname(*this); } \ private: +/** Macro for inclusion in the declaration of a print_context class. + * It declares some functions that are common to all classes derived + * from 'print_context' as well as all required stuff for the GiNaC + * registry. */ +#define GINAC_DECLARE_PRINT_CONTEXT(classname, supername) \ + GINAC_DECLARE_PRINT_CONTEXT_COMMON(classname) \ + typedef supername inherited; \ + const GiNaC::print_context_class_info &get_class_info() const override { return classname::get_class_info_static(); } \ + const char *class_name() const override { return classname::get_class_info_static().options.get_name(); } \ + classname * duplicate() const override { return new classname(*this); } \ +private: + /** Macro for inclusion in the implementation of each print_context class. */ #define GINAC_IMPLEMENT_PRINT_CONTEXT(classname, supername) \ const GiNaC::print_context_class_info &classname::get_class_info_static() \ @@ -92,7 +101,7 @@ extern unsigned next_print_context_id; /** Base class for print_contexts. */ class print_context { - GINAC_DECLARE_PRINT_CONTEXT(print_context, void) + GINAC_DECLARE_PRINT_CONTEXT_BASE(print_context) public: print_context(std::ostream &, unsigned options = 0); virtual ~print_context() {} diff --git a/ginac/registrar.h b/ginac/registrar.h index 1c302534..867d63aa 100644 --- a/ginac/registrar.h +++ b/ginac/registrar.h @@ -125,32 +125,35 @@ private: typedef class_info registered_class_info; - -/** Primary macro for inclusion in the declaration of each registered class. */ -#define GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \ -public: \ - typedef supername inherited; \ +/** Common part of GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS and GINAC_DECLARE_REGISTERED_CLASS. */ +#define GINAC_DECLARE_REGISTERED_CLASS_COMMON(classname) \ private: \ static GiNaC::registered_class_info reg_info; \ public: \ static GiNaC::registered_class_info &get_class_info_static() { return reg_info; } \ - virtual const GiNaC::registered_class_info &get_class_info() const { return classname::get_class_info_static(); } \ - virtual GiNaC::registered_class_info &get_class_info() { return classname::get_class_info_static(); } \ - virtual const char *class_name() const { return classname::get_class_info_static().options.get_name(); } \ class visitor { \ public: \ virtual void visit(const classname &) = 0; \ virtual ~visitor() {}; \ }; +/** Primary macro for inclusion in the declaration of each registered class. */ +#define GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \ + GINAC_DECLARE_REGISTERED_CLASS_COMMON(classname) \ + typedef supername inherited; \ + virtual const GiNaC::registered_class_info &get_class_info() const { return classname::get_class_info_static(); } \ + virtual GiNaC::registered_class_info &get_class_info() { return classname::get_class_info_static(); } \ + virtual const char *class_name() const { return classname::get_class_info_static().options.get_name(); } \ +private: + /** Macro for inclusion in the declaration of each registered class. * It declares some functions that are common to all classes derived * from 'basic' as well as all required stuff for the GiNaC class * registry (mainly needed for archiving). */ #define GINAC_DECLARE_REGISTERED_CLASS(classname, supername) \ - GINAC_DECLARE_REGISTERED_CLASS_NO_CTORS(classname, supername) \ + GINAC_DECLARE_REGISTERED_CLASS_COMMON(classname) \ template friend B & dynallocate(Args &&... args); \ -public: \ + typedef supername inherited; \ classname(); \ classname * duplicate() const override { \ classname * bp = new classname(*this); \ @@ -165,6 +168,9 @@ public: \ else \ inherited::accept(v); \ } \ + const GiNaC::registered_class_info &get_class_info() const override { return classname::get_class_info_static(); } \ + GiNaC::registered_class_info &get_class_info() override { return classname::get_class_info_static(); } \ + const char *class_name() const override { return classname::get_class_info_static().options.get_name(); } \ protected: \ int compare_same_type(const GiNaC::basic & other) const override; \ private: