From: David Blaikie Date: Wed, 4 Mar 2015 18:52:32 +0000 (+0000) Subject: Recommit r231221: "Devirtualize ~parser by making it protected in base classes... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be61f2b51c4ddde2c57de7328b39e403c86b7528;p=llvm Recommit r231221: "Devirtualize ~parser by making it protected in base classes and making derived classes final" Reverted in r231254 due to a self-hosting crash of Clang (see Clang PR22793). Workaround the crash by using {} instead of = default to define a dtor. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231274 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/CommandLine.h b/include/llvm/Support/CommandLine.h index 5bfb221d8fb..bd1d1cb6dc9 100644 --- a/include/llvm/Support/CommandLine.h +++ b/include/llvm/Support/CommandLine.h @@ -714,7 +714,6 @@ class basic_parser_impl { // non-template implementation of basic_parser public: basic_parser_impl(Option &O) {} - virtual ~basic_parser_impl() {} enum ValueExpected getValueExpectedFlagDefault() const { return ValueRequired; @@ -743,6 +742,7 @@ public: virtual void anchor(); protected: + ~basic_parser_impl() = default; // A helper for basic_parser::printOptionDiff. void printOptionName(const Option &O, size_t GlobalWidth) const; }; @@ -755,12 +755,16 @@ public: basic_parser(Option &O) : basic_parser_impl(O) {} typedef DataType parser_data_type; typedef OptionValue OptVal; + +protected: + // Workaround Clang PR22793 + ~basic_parser() {} }; //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -787,7 +791,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser -template <> class parser : public basic_parser { +template <> +class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -813,7 +818,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -835,7 +840,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -858,7 +863,8 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); // parser // template <> -class parser : public basic_parser { +class parser final + : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -881,7 +887,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -903,7 +909,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -925,7 +931,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {} @@ -950,7 +956,7 @@ EXTERN_TEMPLATE_INSTANTIATION(class basic_parser); //-------------------------------------------------- // parser // -template <> class parser : public basic_parser { +template <> class parser final : public basic_parser { public: parser(Option &O) : basic_parser(O) {}