summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-tidy
diff options
context:
space:
mode:
authorJonas Toth <jonas.toth@gmail.com>2018-10-05 13:36:00 +0000
committerJonas Toth <jonas.toth@gmail.com>2018-10-05 13:36:00 +0000
commitd0794365710a85f3c8c4f9847c80eddace29d954 (patch)
tree8d08af9296572ef156d98a20792871b78a208709 /clang-tools-extra/clang-tidy
parent149de8de19064a599c64975b3b218e7ce5f2aaa3 (diff)
downloadbcm5719-llvm-d0794365710a85f3c8c4f9847c80eddace29d954.tar.gz
bcm5719-llvm-d0794365710a85f3c8c4f9847c80eddace29d954.zip
[clang-tidy] Replace deprecated std::ios_base aliases
This check warns the uses of the deprecated member types of std::ios_base and replaces those that have a non-deprecated equivalent. Patch by andobence! Reviewd by: alexfh Revision ID: https://reviews.llvm.org/D51332 llvm-svn: 343848
Diffstat (limited to 'clang-tools-extra/clang-tidy')
-rw-r--r--clang-tools-extra/clang-tidy/modernize/CMakeLists.txt1
-rw-r--r--clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.cpp80
-rw-r--r--clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h36
-rw-r--r--clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp3
4 files changed, 120 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
index 06ea18d670a..1c8dc46271a 100644
--- a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt
@@ -4,6 +4,7 @@ add_clang_library(clangTidyModernizeModule
AvoidBindCheck.cpp
ConcatNestedNamespacesCheck.cpp
DeprecatedHeadersCheck.cpp
+ DeprecatedIosBaseAliasesCheck.cpp
LoopConvertCheck.cpp
LoopConvertUtils.cpp
MakeSharedCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.cpp b/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.cpp
new file mode 100644
index 00000000000..2e9dad99e5d
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.cpp
@@ -0,0 +1,80 @@
+//===--- DeprecatedIosBaseAliasesCheck.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 "DeprecatedIosBaseAliasesCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace modernize {
+
+static const std::array<StringRef, 5> DeprecatedTypes = {
+ "::std::ios_base::io_state", "::std::ios_base::open_mode",
+ "::std::ios_base::seek_dir", "::std::ios_base::streamoff",
+ "::std::ios_base::streampos",
+};
+
+static const llvm::StringMap<StringRef> ReplacementTypes = {
+ {"io_state", "iostate"},
+ {"open_mode", "openmode"},
+ {"seek_dir", "seekdir"}};
+
+void DeprecatedIosBaseAliasesCheck::registerMatchers(MatchFinder *Finder) {
+ // Only register the matchers for C++; the functionality currently does not
+ // provide any benefit to other languages, despite being benign.
+ if (!getLangOpts().CPlusPlus)
+ return;
+
+ auto IoStateDecl = typedefDecl(hasAnyName(DeprecatedTypes)).bind("TypeDecl");
+ auto IoStateType =
+ qualType(hasDeclaration(IoStateDecl), unless(elaboratedType()));
+
+ Finder->addMatcher(typeLoc(loc(IoStateType)).bind("TypeLoc"), this);
+}
+
+void DeprecatedIosBaseAliasesCheck::check(
+ const MatchFinder::MatchResult &Result) {
+ SourceManager &SM = *Result.SourceManager;
+
+ const auto *Typedef = Result.Nodes.getNodeAs<TypedefDecl>("TypeDecl");
+ StringRef TypeName = Typedef->getName();
+ bool HasReplacement = ReplacementTypes.count(TypeName);
+
+ const auto *TL = Result.Nodes.getNodeAs<TypeLoc>("TypeLoc");
+ SourceLocation IoStateLoc = TL->getBeginLoc();
+
+ // Do not generate fixits for matches depending on template arguments and
+ // macro expansions.
+ bool Fix = HasReplacement && !TL->getType()->isDependentType();
+ if (IoStateLoc.isMacroID()) {
+ IoStateLoc = SM.getSpellingLoc(IoStateLoc);
+ Fix = false;
+ }
+
+ SourceLocation EndLoc = IoStateLoc.getLocWithOffset(TypeName.size() - 1);
+
+ if (HasReplacement) {
+ auto FixName = ReplacementTypes.lookup(TypeName);
+ auto Builder = diag(IoStateLoc, "'std::ios_base::%0' is deprecated; use "
+ "'std::ios_base::%1' instead")
+ << TypeName << FixName;
+
+ if (Fix)
+ Builder << FixItHint::CreateReplacement(SourceRange(IoStateLoc, EndLoc),
+ FixName);
+ } else
+ diag(IoStateLoc, "'std::ios_base::%0' is deprecated") << TypeName;
+}
+
+} // namespace modernize
+} // namespace tidy
+} // namespace clang
diff --git a/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h b/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h
new file mode 100644
index 00000000000..bbccd4131ce
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/modernize/DeprecatedIosBaseAliasesCheck.h
@@ -0,0 +1,36 @@
+//===--- DeprecatedIosBaseAliasesCheck.h - clang-tidy------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_DEPRECATEDIOSBASEALIASESCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_DEPRECATEDIOSBASEALIASESCHECK_H
+
+#include "../ClangTidy.h"
+
+namespace clang {
+namespace tidy {
+namespace modernize {
+
+/// This check warns the uses of the deprecated member types of ``std::ios_base``
+/// and replaces those that have a non-deprecated equivalent.
+///
+/// For the user-facing documentation see:
+/// http://clang.llvm.org/extra/clang-tidy/checks/modernize-deprecated-ios-base-aliases.html
+class DeprecatedIosBaseAliasesCheck : public ClangTidyCheck {
+public:
+ DeprecatedIosBaseAliasesCheck(StringRef Name, ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context) {}
+ void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+ void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+};
+
+} // namespace modernize
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_DEPRECATEDIOSBASEALIASESCHECK_H
diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
index fa0a4907129..8f2f52b1cb5 100644
--- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
@@ -13,6 +13,7 @@
#include "AvoidBindCheck.h"
#include "ConcatNestedNamespacesCheck.h"
#include "DeprecatedHeadersCheck.h"
+#include "DeprecatedIosBaseAliasesCheck.h"
#include "LoopConvertCheck.h"
#include "MakeSharedCheck.h"
#include "MakeUniqueCheck.h"
@@ -51,6 +52,8 @@ public:
"modernize-concat-nested-namespaces");
CheckFactories.registerCheck<DeprecatedHeadersCheck>(
"modernize-deprecated-headers");
+ CheckFactories.registerCheck<DeprecatedIosBaseAliasesCheck>(
+ "modernize-deprecated-ios-base-aliases");
CheckFactories.registerCheck<LoopConvertCheck>("modernize-loop-convert");
CheckFactories.registerCheck<MakeSharedCheck>("modernize-make-shared");
CheckFactories.registerCheck<MakeUniqueCheck>("modernize-make-unique");
OpenPOWER on IntegriCloud