From 11c03fe898157c8cbc590f48b36be6348a8f9cda Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 4 Mar 2015 06:57:14 +0000 Subject: [PATCH] Devirtualize OptionValue::~OptionValue in favor of protected in the base, with final derived classes These objects are never polymorphically owned, so there's no need for virtual dtors - just make the dtor protected in the base classes, and make the derived classes final. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231217 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/CommandLine.h | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index 64c5d963d2c..df6f99d6d80 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -352,9 +352,11 @@ struct cat { // Support value comparison outside the template. struct GenericOptionValue { - virtual ~GenericOptionValue() {} virtual bool compare(const GenericOptionValue &V) const = 0; +protected: + ~GenericOptionValue() = default; + private: virtual void anchor(); }; @@ -380,6 +382,9 @@ struct OptionValueBase : public GenericOptionValue { bool compare(const GenericOptionValue & /*V*/) const override { return false; } + +protected: + ~OptionValueBase() = default; }; // Simple copy of the option value. @@ -387,6 +392,9 @@ template class OptionValueCopy : public GenericOptionValue { DataType Value; bool Valid; +protected: + ~OptionValueCopy() = default; + public: OptionValueCopy() : Valid(false) {} @@ -417,12 +425,16 @@ public: template struct OptionValueBase : OptionValueCopy { typedef DataType WrapperType; + +protected: + ~OptionValueBase() = default; }; // Top-level option class. template -struct OptionValue : OptionValueBase::value> { - OptionValue() {} +struct OptionValue final + : OptionValueBase::value> { + OptionValue() = default; OptionValue(const DataType &V) { this->setValue(V); } // Some options may take their value from a different data type. @@ -435,7 +447,8 @@ struct OptionValue : OptionValueBase::value> { // Other safe-to-copy-by-value common option types. enum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE }; template <> -struct OptionValue : OptionValueCopy { +struct OptionValue final + : OptionValueCopy { typedef cl::boolOrDefault WrapperType; OptionValue() {} @@ -450,7 +463,8 @@ private: void anchor() override; }; -template <> struct OptionValue : OptionValueCopy { +template <> +struct OptionValue final : OptionValueCopy { typedef StringRef WrapperType; OptionValue() {}