[PATCH] D12031: Const std::move() argument ClangTidy check
Alexander Kornienko via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 3 13:41:38 PST 2015
alexfh added inline comments.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:22
@@ +21,3 @@
+ bool IsTypeDependOnTemplateParameter =
+ false; // my first guess was type->getTypeClass () == 30 but it doesn't
+ // work in some cases. Could you please advice better solution.
----------------
aaron.ballman wrote:
> Arg->getType()->isDependentType() should do what you want, if I understand you properly.
Yep, should be what you need.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:30
@@ +29,3 @@
+ bool IsVariable = dyn_cast<DeclRefExpr>(Arg) != nullptr;
+ std::string message = "std::move of the ";
+ message += IsConstArg ? "const " : "";
----------------
Please don't string += as a way to build messages. This creates a temporary each time and reallocates the string buffer. Use one of the these:
std::string message = (llvm::Twine("...") + "..." + "...").str()
(only in a single expression, i.e. don't create variables of the llvm::Twine type, as this can lead to dangling string references), or:
std::string buffer;
llvm::raw_string_ostream message(buffer);
message << "...";
message << "...";
// then use message.str() where you would use an std::string.
The second alternative would be more suitable for this kind of code.
BUT, even this is not needed in the specific case of producing diagnostics, as clang provides a powerful template substitution mechanism, and your code could be written more effectively:
diag("std::move of the %select{const |}0 %select{variable|expression}1 ...") << IsConstArg << IsVariable << ...;
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:39
@@ +38,3 @@
+
+ SourceRange RemoveRange1(CallMove->getLocStart(), Arg->getLocStart());
+ SourceRange RemoveRange2(CallMove->getLocEnd(), CallMove->getLocEnd());
----------------
The variable names don't add much value here. Either remove the variables and use the expressions below or give the variables more useful names. Also note that `SourceRange` can be constructed from a single token (`SourceRange(CallMove->getLocEnd())`).
================
Comment at: test/clang-tidy/move-const-arg.cpp:1
@@ +1,2 @@
+// RUN: $(dirname %s)/check_clang_tidy.sh %s misc-move-const-arg %t
+
----------------
This has changed once more, now `%check_clang_tidy` should be used instead of the script itself. Please also rebase the patch on top of current HEAD.
================
Comment at: test/clang-tidy/move-const-arg.cpp:4
@@ +3,3 @@
+namespace std {
+// Directly copied from the stl.
+template<typename>
----------------
The comment is not useful here. This is a mock implementation, and it's not important where does this come from. Please also clang-format the test with `-style=file` (to pick up formatting options specific to tests, namely unlimited columns limit).
================
Comment at: test/clang-tidy/move-const-arg.cpp:30
@@ +29,3 @@
+ A() {}
+ A(const A& rhs) {}
+ A(A&& rhs) {}
----------------
How did you find that `Arg->getType()->isDependentType()` doesn't work?
http://reviews.llvm.org/D12031
More information about the cfe-commits
mailing list