[llvm] r231217 - Devirtualize OptionValue::~OptionValue in favor of protected in the base, with final derived classes

David Blaikie dblaikie at gmail.com
Tue Mar 3 22:57:14 PST 2015


Author: dblaikie
Date: Wed Mar  4 00:57:14 2015
New Revision: 231217

URL: http://llvm.org/viewvc/llvm-project?rev=231217&view=rev
Log:
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.

Modified:
    llvm/trunk/include/llvm/Support/CommandLine.h

Modified: llvm/trunk/include/llvm/Support/CommandLine.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CommandLine.h?rev=231217&r1=231216&r2=231217&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/CommandLine.h (original)
+++ llvm/trunk/include/llvm/Support/CommandLine.h Wed Mar  4 00:57:14 2015
@@ -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 GenericO
   bool compare(const GenericOptionValue & /*V*/) const override {
     return false;
   }
+
+protected:
+  ~OptionValueBase() = default;
 };
 
 // Simple copy of the option value.
@@ -387,6 +392,9 @@ template <class DataType> class OptionVa
   DataType Value;
   bool Valid;
 
+protected:
+  ~OptionValueCopy() = default;
+
 public:
   OptionValueCopy() : Valid(false) {}
 
@@ -417,12 +425,16 @@ public:
 template <class DataType>
 struct OptionValueBase<DataType, false> : OptionValueCopy<DataType> {
   typedef DataType WrapperType;
+
+protected:
+  ~OptionValueBase() = default;
 };
 
 // Top-level option class.
 template <class DataType>
-struct OptionValue : OptionValueBase<DataType, std::is_class<DataType>::value> {
-  OptionValue() {}
+struct OptionValue final
+    : OptionValueBase<DataType, std::is_class<DataType>::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<Dat
 // Other safe-to-copy-by-value common option types.
 enum boolOrDefault { BOU_UNSET, BOU_TRUE, BOU_FALSE };
 template <>
-struct OptionValue<cl::boolOrDefault> : OptionValueCopy<cl::boolOrDefault> {
+struct OptionValue<cl::boolOrDefault> final
+    : OptionValueCopy<cl::boolOrDefault> {
   typedef cl::boolOrDefault WrapperType;
 
   OptionValue() {}
@@ -450,7 +463,8 @@ private:
   void anchor() override;
 };
 
-template <> struct OptionValue<std::string> : OptionValueCopy<std::string> {
+template <>
+struct OptionValue<std::string> final : OptionValueCopy<std::string> {
   typedef StringRef WrapperType;
 
   OptionValue() {}





More information about the llvm-commits mailing list