diff options
| author | Chih-Hung Hsieh <chh@google.com> | 2017-05-23 16:19:04 +0000 |
|---|---|---|
| committer | Chih-Hung Hsieh <chh@google.com> | 2017-05-23 16:19:04 +0000 |
| commit | 2857b1245b7bab722e3a678fd4e7d65143bc0f55 (patch) | |
| tree | ece6396e8884e1183074d0bafc569509d16f6dc0 | |
| parent | af3d4db64bd2106383be848c46635059d20077fe (diff) | |
| download | bcm5719-llvm-2857b1245b7bab722e3a678fd4e7d65143bc0f55.tar.gz bcm5719-llvm-2857b1245b7bab722e3a678fd4e7d65143bc0f55.zip | |
[clang-tidy] Do not dereference a null BaseType
Check BaseType before dereference.
Simplified test case is derived from Android Open Source code.
Differential Revision: https://reviews.llvm.org/D33430
llvm-svn: 303645
| -rw-r--r-- | clang-tools-extra/clang-tidy/misc/ForwardingReferenceOverloadCheck.cpp | 2 | ||||
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-forwarding-reference-overload.cpp | 22 |
2 files changed, 24 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/ForwardingReferenceOverloadCheck.cpp b/clang-tools-extra/clang-tidy/misc/ForwardingReferenceOverloadCheck.cpp index 2efa53597b5..3da5a0998da 100644 --- a/clang-tools-extra/clang-tidy/misc/ForwardingReferenceOverloadCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/ForwardingReferenceOverloadCheck.cpp @@ -40,6 +40,8 @@ AST_MATCHER(QualType, isEnableIf) { if (const auto *Dependent = BaseType->getAs<DependentNameType>()) { BaseType = Dependent->getQualifier()->getAsType(); } + if (!BaseType) + return false; if (CheckTemplate(BaseType->getAs<TemplateSpecializationType>())) { return true; // Case: enable_if_t< >. } else if (const auto *Elaborated = BaseType->getAs<ElaboratedType>()) { diff --git a/clang-tools-extra/test/clang-tidy/misc-forwarding-reference-overload.cpp b/clang-tools-extra/test/clang-tidy/misc-forwarding-reference-overload.cpp index 6725b0e3ef6..a30946662de 100644 --- a/clang-tools-extra/test/clang-tidy/misc-forwarding-reference-overload.cpp +++ b/clang-tools-extra/test/clang-tidy/misc-forwarding-reference-overload.cpp @@ -121,3 +121,25 @@ public: private: Test6(const Test6 &rhs); }; + +// Do not dereference a null BaseType. +template <class _Callable> class result_of; +template <class _Fp, class ..._Args> class result_of<_Fp(_Args...)> { }; +template <class _Tp> using result_of_t = typename result_of<_Tp>::type; + +template <class... _Types> struct __overload; +template <class _Tp, class... _Types> +struct __overload<_Tp, _Types...> : __overload<_Types...> { + using __overload<_Types...>::operator(); +}; + +template <class _Tp, class... _Types> +using __best_match_t = typename result_of_t<__overload<_Types...>(_Tp&&)>::type; + +template <class... _Types> +class variant { +public: + template <class _Arg, class _Tp = __best_match_t<_Arg, _Types...> > + constexpr variant(_Arg&& __arg) {} + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: constructor accepting a forwarding reference can hide the copy and move constructors +}; |

