summaryrefslogtreecommitdiffstats
path: root/tools/clang
diff options
context:
space:
mode:
authorvmpstr <vmpstr@chromium.org>2016-02-17 14:00:38 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-17 22:01:52 +0000
commit3d84fcc69061aac5c82ade4844749a4754ee5190 (patch)
tree20d190a08850277fa2bfae0f24f13e7760b59895 /tools/clang
parent35bc8e3a01f3339a088f71ddd0c7d64f86548a12 (diff)
downloadchromium_src-3d84fcc69061aac5c82ade4844749a4754ee5190.zip
chromium_src-3d84fcc69061aac5c82ade4844749a4754ee5190.tar.gz
chromium_src-3d84fcc69061aac5c82ade4844749a4754ee5190.tar.bz2
clang-plugin: Enable RecursiveASTVisitor approach by default.
This patch removes the ASTConsumer approach for checking TagDecls in favor of always using RecursiveASTVisitor. This means that some of the warnings have to be temporarily suppressed, since the ASTConsumer approach was never checking them. R=dcheng, thakis@chromium.org BUG=436357 Review URL: https://codereview.chromium.org/1703713002 Cr-Commit-Position: refs/heads/master@{#375995}
Diffstat (limited to 'tools/clang')
-rw-r--r--tools/clang/plugins/ChromeClassTester.cpp12
-rw-r--r--tools/clang/plugins/ChromeClassTester.h10
-rw-r--r--tools/clang/plugins/FindBadConstructsAction.cpp8
-rw-r--r--tools/clang/plugins/FindBadConstructsConsumer.cpp2
-rw-r--r--tools/clang/plugins/Options.h22
-rwxr-xr-xtools/clang/plugins/tests/test.py2
6 files changed, 15 insertions, 41 deletions
diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp
index a6f9fff..2b22ed9 100644
--- a/tools/clang/plugins/ChromeClassTester.cpp
+++ b/tools/clang/plugins/ChromeClassTester.cpp
@@ -41,18 +41,6 @@ ChromeClassTester::ChromeClassTester(CompilerInstance& instance,
ChromeClassTester::~ChromeClassTester() {}
-void ChromeClassTester::HandleTagDeclDefinition(TagDecl* tag) {
- pending_class_decls_.push_back(tag);
-}
-
-bool ChromeClassTester::HandleTopLevelDecl(DeclGroupRef group_ref) {
- for (size_t i = 0; i < pending_class_decls_.size(); ++i)
- CheckTag(pending_class_decls_[i]);
- pending_class_decls_.clear();
-
- return true; // true means continue parsing.
-}
-
void ChromeClassTester::CheckTag(TagDecl* tag) {
// We handle class types here where we have semantic information. We can only
// check structs/classes/enums here, but we get a bunch of nice semantic
diff --git a/tools/clang/plugins/ChromeClassTester.h b/tools/clang/plugins/ChromeClassTester.h
index e3d7e3c..2dcfb42 100644
--- a/tools/clang/plugins/ChromeClassTester.h
+++ b/tools/clang/plugins/ChromeClassTester.h
@@ -15,16 +15,13 @@
// A class on top of ASTConsumer that forwards classes defined in Chromium
// headers to subclasses which implement CheckChromeClass().
-class ChromeClassTester : public clang::ASTConsumer {
+// TODO(vmpstr): Fold this class into FindBadConstructsConsumer.
+class ChromeClassTester {
public:
ChromeClassTester(clang::CompilerInstance& instance,
const chrome_checker::Options& options);
virtual ~ChromeClassTester();
- // clang::ASTConsumer:
- virtual void HandleTagDeclDefinition(clang::TagDecl* tag);
- virtual bool HandleTopLevelDecl(clang::DeclGroupRef group_ref);
-
void CheckTag(clang::TagDecl*);
clang::DiagnosticsEngine::Level getErrorLevel();
@@ -96,9 +93,6 @@ class ChromeClassTester : public clang::ASTConsumer {
// List of types that we don't check.
std::set<std::string> ignored_record_names_;
-
- // List of decls to check once the current top-level decl is parsed.
- std::vector<clang::TagDecl*> pending_class_decls_;
};
#endif // TOOLS_CLANG_PLUGINS_CHROMECLASSTESTER_H_
diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp
index 6762297..e8f103a 100644
--- a/tools/clang/plugins/FindBadConstructsAction.cpp
+++ b/tools/clang/plugins/FindBadConstructsAction.cpp
@@ -36,9 +36,7 @@ FindBadConstructsAction::FindBadConstructsAction() {
std::unique_ptr<ASTConsumer> FindBadConstructsAction::CreateASTConsumer(
CompilerInstance& instance,
llvm::StringRef ref) {
- if (options_.with_ast_visitor)
- return llvm::make_unique<PluginConsumer>(&instance, options_);
- return llvm::make_unique<FindBadConstructsConsumer>(instance, options_);
+ return llvm::make_unique<PluginConsumer>(&instance, options_);
}
bool FindBadConstructsAction::ParseArgs(const CompilerInstance& instance,
@@ -57,12 +55,12 @@ bool FindBadConstructsAction::ParseArgs(const CompilerInstance& instance,
// TODO(tsepez): Enable this by default once http://crbug.com/356815
// and http://crbug.com/356816 are fixed.
options_.check_enum_last_value = true;
- } else if (args[i] == "with-ast-visitor") {
- options_.with_ast_visitor = true;
} else if (args[i] == "check-templates") {
options_.check_templates = true;
} else if (args[i] == "follow-macro-expansion") {
options_.follow_macro_expansion = true;
+ } else if (args[i] == "check-implicit-copy-ctors") {
+ options_.check_implicit_copy_ctors = true;
} else {
parsed = false;
llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n";
diff --git a/tools/clang/plugins/FindBadConstructsConsumer.cpp b/tools/clang/plugins/FindBadConstructsConsumer.cpp
index c79a764..b7e1886 100644
--- a/tools/clang/plugins/FindBadConstructsConsumer.cpp
+++ b/tools/clang/plugins/FindBadConstructsConsumer.cpp
@@ -288,7 +288,7 @@ void FindBadConstructsConsumer::CheckCtorDtorWeight(
// The current check is buggy. An implicit copy constructor does not
// have an inline body, so this check never fires for classes with a
// user-declared out-of-line constructor.
- if (it->hasInlineBody()) {
+ if (it->hasInlineBody() && options_.check_implicit_copy_ctors) {
if (it->isCopyConstructor() &&
!record->hasUserDeclaredCopyConstructor()) {
// In general, implicit constructors are generated on demand. But
diff --git a/tools/clang/plugins/Options.h b/tools/clang/plugins/Options.h
index bb5857f..58c66f4 100644
--- a/tools/clang/plugins/Options.h
+++ b/tools/clang/plugins/Options.h
@@ -8,21 +8,15 @@
namespace chrome_checker {
struct Options {
- Options()
- : check_base_classes(false),
- enforce_in_pdf(false),
- enforce_in_thirdparty_webkit(false),
- check_enum_last_value(false),
- with_ast_visitor(false),
- check_templates(false) {}
-
- bool check_base_classes;
- bool enforce_in_pdf;
- bool enforce_in_thirdparty_webkit; // Use in Blink code itself
- bool check_enum_last_value;
- bool with_ast_visitor;
- bool check_templates;
+ bool check_base_classes = false;
+ bool enforce_in_pdf = false;
+ bool enforce_in_thirdparty_webkit = false; // Use in Blink code itself
+ bool check_enum_last_value = false;
+ bool check_templates = false;
bool follow_macro_expansion = false;
+ // This is needed during the migration from ASTConsumer approach to the
+ // RecursiveASTVisitor approach. See https://crbug.com/436357 for details.
+ bool check_implicit_copy_ctors = false;
};
} // namespace chrome_checker
diff --git a/tools/clang/plugins/tests/test.py b/tools/clang/plugins/tests/test.py
index 30721e9..3e8b94b 100755
--- a/tools/clang/plugins/tests/test.py
+++ b/tools/clang/plugins/tests/test.py
@@ -19,7 +19,7 @@ class ChromeStylePluginTest(plugin_testing.ClangPluginTest):
"""Test harness for the Chrome style plugin."""
def AdjustClangArguments(self, clang_cmd):
- self.AddPluginArg(clang_cmd, 'with-ast-visitor')
+ self.AddPluginArg(clang_cmd, 'check-implicit-copy-ctors')
self.AddPluginArg(clang_cmd, 'follow-macro-expansion')
clang_cmd.extend([
# Skip code generation