[PATCH] missing-namespace-std check for clang-tidy

Manuel Klimek klimek at google.com
Wed Feb 18 07:42:59 PST 2015


REPOSITORY
  rL LLVM

================
Comment at: clang-tidy/misc/MissingNamespaceStdCheck.cpp:21
@@ +20,3 @@
+void MissingNamespaceStdCheck::registerMatchers(MatchFinder *Finder) {
+  Finder->addMatcher(decl(anyOf(fieldDecl(),varDecl())).bind("field_or_variable"), this);
+}
----------------
I imagine you'll want to replace this matcher with something like:
loc(qualType(hasDeclaration(decl(hasAncestor(decl(namespaceDecl(hasName("std")))))), unless(elaboratedType(hasQualifier(anyOf(specifiesNamespace(hasName("std")), hasPrefix(specifiesNamespace(hasName("std")))))))))
(you can pull out duplicate submatchers with auto matcher = ... and reuse it)
The problem is that we don't have hasParent for typeLoc matches, so for
std::X
this will still match "X" (the inner typeloc).
For that you'll need to make sure to have a matcher like:
loc(elaboratedType(namesType(type().bind("root"))))
store the bound types as "visited", 
and then make sure when you hit the callback for the first matcher that the type was not visited via an outer elaboratedType already.

http://reviews.llvm.org/D7714

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the cfe-commits mailing list