summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2017-05-23 16:19:04 +0000
committerChih-Hung Hsieh <chh@google.com>2017-05-23 16:19:04 +0000
commit2857b1245b7bab722e3a678fd4e7d65143bc0f55 (patch)
treeece6396e8884e1183074d0bafc569509d16f6dc0
parentaf3d4db64bd2106383be848c46635059d20077fe (diff)
downloadbcm5719-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.cpp2
-rw-r--r--clang-tools-extra/test/clang-tidy/misc-forwarding-reference-overload.cpp22
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
+};
OpenPOWER on IntegriCloud