Index: clang-tools-extra/trunk/clang-tidy/modernize/UseNullptrCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/modernize/UseNullptrCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/modernize/UseNullptrCheck.cpp @@ -190,13 +190,21 @@ // within a cast expression. bool VisitStmt(Stmt *S) { CastExpr *C = dyn_cast(S); + // Catch the castExpr inside cxxDefaultArgExpr. + if (auto *E = dyn_cast(S)) + C = dyn_cast(E->getExpr()); if (!C) { FirstSubExpr = nullptr; return true; } + if (!FirstSubExpr) FirstSubExpr = C->getSubExpr()->IgnoreParens(); + // Ignore the expr if it is already a nullptr literal expr. + if (isa(FirstSubExpr)) + return true; + if (C->getCastKind() != CK_NullToPointer && C->getCastKind() != CK_NullToMemberPointer) { return true; Index: clang-tools-extra/trunk/test/clang-tidy/modernize-use-nullptr.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/modernize-use-nullptr.cpp +++ clang-tools-extra/trunk/test/clang-tidy/modernize-use-nullptr.cpp @@ -217,3 +217,14 @@ // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr // CHECK-FIXES: C c; #undef F + +// Test default argument expression. +struct D { + explicit D(void *t, int *c = NULL) {} + // CHECK-MESSAGES: :[[@LINE-1]]:32: warning: use nullptr + // CHECK-FIXES: explicit D(void *t, int *c = nullptr) {} +}; + +void test_default_argument() { + D(nullptr); +}