Skip to content

Commit

Permalink
[clang-tidy] Do not dereference a null BaseType
Browse files Browse the repository at this point in the history
Check BaseType before dereference.
Simplified test case is derived from Android Open Source code.

Differential Revision: https://reviews.llvm.org/D33430

llvm-svn: 303645
  • Loading branch information
chih-hung committed May 23, 2017
1 parent af3d4db commit 2857b12
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
Expand Up @@ -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>()) {
Expand Down
Expand Up @@ -121,3 +121,25 @@ class Test6 {
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
};

0 comments on commit 2857b12

Please sign in to comment.