diff options
Diffstat (limited to 'clang-tools-extra/cpp11-migrate/Core/CustomMatchers.h')
-rw-r--r-- | clang-tools-extra/cpp11-migrate/Core/CustomMatchers.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/clang-tools-extra/cpp11-migrate/Core/CustomMatchers.h b/clang-tools-extra/cpp11-migrate/Core/CustomMatchers.h new file mode 100644 index 00000000000..9af04977996 --- /dev/null +++ b/clang-tools-extra/cpp11-migrate/Core/CustomMatchers.h @@ -0,0 +1,59 @@ +//===-- Core/CustomMatchers.h - Perf measurement helpers -----------*- C++ -*-===// +// +// 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 provides custom matchers to be used by different +/// transforms that requier the same matchers. +/// +//===----------------------------------------------------------------------===// + +#ifndef CPP11_MIGRATE_CUSTOMMATCHERS_H +#define CPP11_MIGRATE_CUSTOMMATCHERS_H + +#include "clang/ASTMatchers/ASTMatchers.h" + +namespace clang { +namespace ast_matchers { + +/// \brief Matches declarations whose declaration context is the C++ standard +/// library namespace \c std. +/// +/// Note that inline namespaces are silently ignored during the lookup since +/// both libstdc++ and libc++ are known to use them for versioning purposes. +/// +/// Given +/// \code +/// namespace ns { +/// struct my_type {}; +/// using namespace std; +/// } +/// +/// using std::vector; +/// using ns::my_type; +/// using ns::list; +/// \endcode +/// usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(isFromStdNamespace()))) +/// matches "using std::vector" and "using ns::list". +AST_MATCHER(Decl, isFromStdNamespace) { + const DeclContext *D = Node.getDeclContext(); + + while (D->isInlineNamespace()) + D = D->getParent(); + + if (!D->isNamespace() || !D->getParent()->isTranslationUnit()) + return false; + + const IdentifierInfo *Info = cast<NamespaceDecl>(D)->getIdentifier(); + + return Info && Info->isStr("std"); +} +} // namespace ast_matchers +} // namespace clang + +#endif // CPP11_MIGRATE_CUSTOMMATCHERS_H |