diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2013-09-04 17:35:07 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2013-09-04 17:35:07 +0000 |
commit | d9063c46f59f4bec47bcbeddca8ca2f789348c03 (patch) | |
tree | 76505542df7a05016dc71ffe44ed3ba264fb54be /clang-tools-extra/clang-modernize/UseNullptr/NullptrMatchers.cpp | |
parent | 6a23d212897d5402035cfaea82260f6dae1c8f2a (diff) | |
download | bcm5719-llvm-d9063c46f59f4bec47bcbeddca8ca2f789348c03.tar.gz bcm5719-llvm-d9063c46f59f4bec47bcbeddca8ca2f789348c03.zip |
Rename cpp11-migrate to clang-modernize.
There is no reason to expect this tool to be limited to C++11, it seems
very likely to be of on-going interest. It seems likely to be useful for
modernizing even as new libraries come out in TSes and other formats
than a complete standard. Fundamentally, we need something a bit more
general. After some discussion on the list, going with
'clang-modernize'.
I've tried to do a reasonably comprehensive job of fixing up the names,
but I may still have missed some. Feel free to poke me if you spot any
fallout here. Things I've tried reasonably hard to find and fix:
- cpp11-migrate -> clang-modernize
- Migrator -> Modernizer
- Clean up the introductory documentation that was C++11 specific.
I'll also point out that this tool continues to delight me. =] Also,
a huge thanks to those who have so carefully, thoroughly documented the
tool. The docs here are simply phenomenal. Every tool should be this
well documented. I hope I have updated the documentation reasonably
well, but I'm not very good at documentation, so review much
appreciated.
llvm-svn: 189960
Diffstat (limited to 'clang-tools-extra/clang-modernize/UseNullptr/NullptrMatchers.cpp')
-rw-r--r-- | clang-tools-extra/clang-modernize/UseNullptr/NullptrMatchers.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-modernize/UseNullptr/NullptrMatchers.cpp b/clang-tools-extra/clang-modernize/UseNullptr/NullptrMatchers.cpp new file mode 100644 index 00000000000..0995c168b50 --- /dev/null +++ b/clang-tools-extra/clang-modernize/UseNullptr/NullptrMatchers.cpp @@ -0,0 +1,70 @@ +//===-- UseNullptr/NullptrMatchers.cpp - Matchers for null casts ----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// \brief This file contains the definitions for matcher-generating functions +/// and a custom AST_MATCHER for identifying casts of type CK_NullTo*. +/// +//===----------------------------------------------------------------------===// + +#include "NullptrMatchers.h" +#include "clang/AST/ASTContext.h" + +using namespace clang::ast_matchers; +using namespace clang; + +const char *CastSequence = "sequence"; + +namespace clang { +namespace ast_matchers { +/// \brief Matches cast expressions that have a cast kind of CK_NullToPointer +/// or CK_NullToMemberPointer. +/// +/// Given +/// \code +/// int *p = 0; +/// \endcode +/// implicitCastExpr(isNullToPointer()) matches the implicit cast clang adds +/// around \c 0. +AST_MATCHER(CastExpr, isNullToPointer) { + return Node.getCastKind() == CK_NullToPointer || + Node.getCastKind() == CK_NullToMemberPointer; +} + +AST_MATCHER(Type, sugaredNullptrType) { + const Type *DesugaredType = Node.getUnqualifiedDesugaredType(); + if (const BuiltinType *BT = dyn_cast<BuiltinType>(DesugaredType)) + return BT->getKind() == BuiltinType::NullPtr; + return false; +} + +} // end namespace ast_matchers +} // end namespace clang + +StatementMatcher makeCastSequenceMatcher() { + StatementMatcher ImplicitCastToNull = + implicitCastExpr( + isNullToPointer(), + unless( + hasSourceExpression( + hasType(sugaredNullptrType()) + ) + ) + ); + + return castExpr( + anyOf( + ImplicitCastToNull, + explicitCastExpr( + hasDescendant(ImplicitCastToNull) + ) + ), + unless(hasAncestor(explicitCastExpr())) + ).bind(CastSequence); +} |