Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: tools/clang/plugins/FindBadConstructsConsumer.h

Issue 1385193002: Bisect clang Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 246985 Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/clang/plugins/FindBadConstructsAction.cpp ('k') | tools/clang/plugins/FindBadConstructsConsumer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/clang/plugins/FindBadConstructsConsumer.h
diff --git a/tools/clang/plugins/FindBadConstructsConsumer.h b/tools/clang/plugins/FindBadConstructsConsumer.h
new file mode 100644
index 0000000000000000000000000000000000000000..8f8fc87046630911ac93ae59995da6d5c8ca8a68
--- /dev/null
+++ b/tools/clang/plugins/FindBadConstructsConsumer.h
@@ -0,0 +1,117 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file defines a bunch of recurring problems in the Chromium C++ code.
+//
+// Checks that are implemented:
+// - Constructors/Destructors should not be inlined if they are of a complex
+// class type.
+// - Missing "virtual" keywords on methods that should be virtual.
+// - Non-annotated overriding virtual methods.
+// - Virtual methods with nonempty implementations in their headers.
+// - Classes that derive from base::RefCounted / base::RefCountedThreadSafe
+// should have protected or private destructors.
+// - WeakPtrFactory members that refer to their outer class should be the last
+// member.
+// - Enum types with a xxxx_LAST or xxxxLast const actually have that constant
+// have the maximal value for that type.
+
+#ifndef TOOLS_CLANG_PLUGINS_FINDBADCONSTRUCTSCONSUMER_H_
+#define TOOLS_CLANG_PLUGINS_FINDBADCONSTRUCTSCONSUMER_H_
+
+#include "clang/AST/AST.h"
+#include "clang/AST/ASTConsumer.h"
+#include "clang/AST/Attr.h"
+#include "clang/AST/CXXInheritance.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/TypeLoc.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Basic/SourceLocation.h"
+
+#include "ChromeClassTester.h"
+#include "Options.h"
+#include "SuppressibleDiagnosticBuilder.h"
+
+namespace chrome_checker {
+
+// Searches for constructs that we know we don't want in the Chromium code base.
+class FindBadConstructsConsumer
+ : public clang::RecursiveASTVisitor<FindBadConstructsConsumer>,
+ public ChromeClassTester {
+ public:
+ FindBadConstructsConsumer(clang::CompilerInstance& instance,
+ const Options& options);
+
+ // RecursiveASTVisitor:
+ bool VisitDecl(clang::Decl* decl);
+
+ // ChromeClassTester overrides:
+ void CheckChromeClass(clang::SourceLocation record_location,
+ clang::CXXRecordDecl* record) override;
+ void CheckChromeEnum(clang::SourceLocation enum_location,
+ clang::EnumDecl* enum_decl) override;
+
+ private:
+ // The type of problematic ref-counting pattern that was encountered.
+ enum RefcountIssue { None, ImplicitDestructor, PublicDestructor };
+
+ void CheckCtorDtorWeight(clang::SourceLocation record_location,
+ clang::CXXRecordDecl* record);
+
+ bool InTestingNamespace(const clang::Decl* record);
+ bool IsMethodInBannedOrTestingNamespace(const clang::CXXMethodDecl* method);
+
+ // Returns a diagnostic builder that only emits the diagnostic if the spelling
+ // location (the actual characters that make up the token) is not in an
+ // ignored file. This is useful for situations where the token might originate
+ // from a macro in a system header: warning isn't useful, since system headers
+ // generally can't be easily updated.
+ SuppressibleDiagnosticBuilder ReportIfSpellingLocNotIgnored(
+ clang::SourceLocation loc,
+ unsigned diagnostic_id);
+
+ void CheckVirtualMethods(clang::SourceLocation record_location,
+ clang::CXXRecordDecl* record,
+ bool warn_on_inline_bodies);
+ void CheckVirtualSpecifiers(const clang::CXXMethodDecl* method);
+ void CheckVirtualBodies(const clang::CXXMethodDecl* method);
+
+ void CountType(const clang::Type* type,
+ int* trivial_member,
+ int* non_trivial_member,
+ int* templated_non_trivial_member);
+
+ static RefcountIssue CheckRecordForRefcountIssue(
+ const clang::CXXRecordDecl* record,
+ clang::SourceLocation& loc);
+ bool IsRefCounted(const clang::CXXBaseSpecifier* base,
+ clang::CXXBasePath& path);
+ static bool HasPublicDtorCallback(const clang::CXXBaseSpecifier* base,
+ clang::CXXBasePath& path,
+ void* user_data);
+ void PrintInheritanceChain(const clang::CXXBasePath& path);
+ unsigned DiagnosticForIssue(RefcountIssue issue);
+ void CheckRefCountedDtors(clang::SourceLocation record_location,
+ clang::CXXRecordDecl* record);
+
+ void CheckWeakPtrFactoryMembers(clang::SourceLocation record_location,
+ clang::CXXRecordDecl* record);
+
+ unsigned diag_method_requires_override_;
+ unsigned diag_redundant_virtual_specifier_;
+ unsigned diag_base_method_virtual_and_final_;
+ unsigned diag_no_explicit_dtor_;
+ unsigned diag_public_dtor_;
+ unsigned diag_protected_non_virtual_dtor_;
+ unsigned diag_weak_ptr_factory_order_;
+ unsigned diag_bad_enum_last_value_;
+ unsigned diag_note_inheritance_;
+ unsigned diag_note_implicit_dtor_;
+ unsigned diag_note_public_dtor_;
+ unsigned diag_note_protected_non_virtual_dtor_;
+};
+
+} // namespace chrome_checker
+
+#endif // TOOLS_CLANG_PLUGINS_FINDBADCONSTRUCTSCONSUMER_H_
« no previous file with comments | « tools/clang/plugins/FindBadConstructsAction.cpp ('k') | tools/clang/plugins/FindBadConstructsConsumer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698