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

Side by Side Diff: tools/clang/plugins/FindBadConstructs.cpp

Issue 6901095: clang: Mention that the ctor/dtor needs "out of line" implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update test expectations Created 9 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tools/clang/plugins/tests/missing_ctor.txt » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This file defines a bunch of recurring problems in the Chromium C++ code. 5 // This file defines a bunch of recurring problems in the Chromium C++ code.
6 // 6 //
7 // Checks that are implemented: 7 // Checks that are implemented:
8 // - Constructors/Destructors should not be inlined if they are of a complex 8 // - Constructors/Destructors should not be inlined if they are of a complex
9 // class type. 9 // class type.
10 // - Missing "virtual" keywords on methods that should be virtual. 10 // - Missing "virtual" keywords on methods that should be virtual.
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 // The fourth normal class member should trigger the warning. 97 // The fourth normal class member should trigger the warning.
98 dtor_score += non_trivial_member * 3; 98 dtor_score += non_trivial_member * 3;
99 99
100 int ctor_score = dtor_score; 100 int ctor_score = dtor_score;
101 // You should be able to have 9 ints before we warn you. 101 // You should be able to have 9 ints before we warn you.
102 ctor_score += trivial_member; 102 ctor_score += trivial_member;
103 103
104 if (ctor_score >= 10) { 104 if (ctor_score >= 10) {
105 if (!record->hasUserDeclaredConstructor()) { 105 if (!record->hasUserDeclaredConstructor()) {
106 emitWarning(record_location, 106 emitWarning(record_location,
107 "Complex class/struct needs a declared constructor."); 107 "Complex class/struct needs an explicit out-of-line "
108 "constructor.");
108 } else { 109 } else {
109 // Iterate across all the constructors in this file and yell if we 110 // Iterate across all the constructors in this file and yell if we
110 // find one that tries to be inline. 111 // find one that tries to be inline.
111 for (CXXRecordDecl::ctor_iterator it = record->ctor_begin(); 112 for (CXXRecordDecl::ctor_iterator it = record->ctor_begin();
112 it != record->ctor_end(); ++it) { 113 it != record->ctor_end(); ++it) {
113 if (it->hasInlineBody()) { 114 if (it->hasInlineBody()) {
114 emitWarning(it->getInnerLocStart(), 115 emitWarning(it->getInnerLocStart(),
115 "Complex constructor has an inlined body."); 116 "Complex constructor has an inlined body.");
116 } 117 }
117 } 118 }
118 } 119 }
119 } 120 }
120 121
121 // The destructor side is equivalent except that we don't check for 122 // The destructor side is equivalent except that we don't check for
122 // trivial members; 20 ints don't need a destructor. 123 // trivial members; 20 ints don't need a destructor.
123 if (dtor_score >= 10 && !record->hasTrivialDestructor()) { 124 if (dtor_score >= 10 && !record->hasTrivialDestructor()) {
124 if (!record->hasUserDeclaredDestructor()) { 125 if (!record->hasUserDeclaredDestructor()) {
125 emitWarning(record_location, 126 emitWarning(
126 "Complex class/struct needs a declared destructor."); 127 record_location,
128 "Complex class/struct needs a needs an explicit out-of-line "
129 "destructor.");
127 } else if (CXXDestructorDecl* dtor = record->getDestructor()) { 130 } else if (CXXDestructorDecl* dtor = record->getDestructor()) {
128 if (dtor->hasInlineBody()) { 131 if (dtor->hasInlineBody()) {
129 emitWarning(dtor->getInnerLocStart(), 132 emitWarning(dtor->getInnerLocStart(),
130 "Complex destructor has an inline body."); 133 "Complex destructor has an inline body.");
131 } 134 }
132 } 135 }
133 } 136 }
134 } 137 }
135 138
136 // Makes sure there is a "virtual" keyword on virtual methods and that there 139 // Makes sure there is a "virtual" keyword on virtual methods and that there
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 const std::vector<std::string>& args) { 256 const std::vector<std::string>& args) {
254 // We don't take any additional arguments here. 257 // We don't take any additional arguments here.
255 return true; 258 return true;
256 } 259 }
257 }; 260 };
258 261
259 } // namespace 262 } // namespace
260 263
261 static FrontendPluginRegistry::Add<FindBadConstructsAction> 264 static FrontendPluginRegistry::Add<FindBadConstructsAction>
262 X("find-bad-constructs", "Finds bad C++ constructs"); 265 X("find-bad-constructs", "Finds bad C++ constructs");
OLDNEW
« no previous file with comments | « no previous file | tools/clang/plugins/tests/missing_ctor.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698