summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp
diff options
context:
space:
mode:
authorGabor Horvath <xazax.hun@gmail.com>2017-02-17 08:52:51 +0000
committerGabor Horvath <xazax.hun@gmail.com>2017-02-17 08:52:51 +0000
commite2fa53030e1457060e5b88d4168be9c5b121054c (patch)
treeafe0e4ab990a5a8dbf4815147ae8e9629caee85a /clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp
parent3c35491f02f79e71688ca4d2ca63c243e3e5b18c (diff)
downloadbcm5719-llvm-e2fa53030e1457060e5b88d4168be9c5b121054c.tar.gz
bcm5719-llvm-e2fa53030e1457060e5b88d4168be9c5b121054c.zip
[clang-tidy] Add cert-dcl58-cpp (do not modify the 'std' namespace) check.
Differential Revision: https://reviews.llvm.org/D23421 llvm-svn: 295435
Diffstat (limited to 'clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp')
-rw-r--r--clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp b/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp
new file mode 100644
index 00000000000..e5759a5215a
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/cert/DontModifyStdNamespaceCheck.cpp
@@ -0,0 +1,49 @@
+//===--- DontModifyStdNamespaceCheck.cpp - clang-tidy----------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DontModifyStdNamespaceCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace cert {
+
+void DontModifyStdNamespaceCheck::registerMatchers(MatchFinder *Finder) {
+ if (!getLangOpts().CPlusPlus)
+ return;
+
+ Finder->addMatcher(
+ namespaceDecl(unless(isExpansionInSystemHeader()),
+ anyOf(hasName("std"), hasName("posix")),
+ has(decl(unless(anyOf(
+ functionDecl(isExplicitTemplateSpecialization()),
+ cxxRecordDecl(isExplicitTemplateSpecialization()))))))
+ .bind("nmspc"),
+ this);
+}
+
+void DontModifyStdNamespaceCheck::check(
+ const MatchFinder::MatchResult &Result) {
+ const auto *N = Result.Nodes.getNodeAs<NamespaceDecl>("nmspc");
+
+ // Only consider top level namespaces.
+ if (N->getParent() != Result.Context->getTranslationUnitDecl())
+ return;
+
+ diag(N->getLocation(),
+ "modification of %0 namespace can result in undefined behavior")
+ << N;
+}
+
+} // namespace cert
+} // namespace tidy
+} // namespace clang
OpenPOWER on IntegriCloud