[PATCH] D12031: Const std::move() argument ClangTidy check
Alexander Kornienko via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 23 17:39:03 PST 2015
alexfh added a comment.
Thank you for the update! Looks almost right. A few minor comments.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:34
@@ +33,3 @@
+ const Expr *Arg = CallMove->getArg(0);
+ auto *Context = Result.Context;
+
----------------
Looks like you're using `Context` once and all the other times you need `Context->getSourceManager()`. I suggest pulling it to a local variable (`SourceManager &SM` or `SourceManager &Sources` - whatever you like more) and replace the usage of `Context` with `Result.Context`.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:40
@@ +39,3 @@
+ if (IsConstArg || IsTriviallyCopyable) {
+ auto MoveRange = CharSourceRange::getCharRange(CallMove->getLocStart(),
+ CallMove->getLocEnd());
----------------
You should be able to use `CharSourceRange::getCharRange(CallMove->getSourceRange())` instead. It's slightly more compact.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:45
@@ +44,3 @@
+ if (!FileMoveRange.isValid()) {
+ // Do nothing if this move call is in a macro expansion.
+ return;
----------------
Remove the comment, it's now wrong.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:51
@@ +50,3 @@
+ diag(FileMoveRange.getBegin(),
+ "std::move of the %select{|const "
+ "}0%select{expression|variable}1 %select{|of "
----------------
nit: clang-format has done a poor job here: spaces are not the best places to break this string literal. Please manually reformat this literal so that the `%select{...}N` constructs are not broken. Thanks!
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:54
@@ +53,3 @@
+ "trivially-copyable type }2has no effect; "
+ "remove std::move().")
+ << IsConstArg << IsVariable << IsTriviallyCopyable
----------------
Diagnostic messages are not full sentences and thus require neither capitalization (already fine here) nor trailing period.
================
Comment at: clang-tidy/misc/MoveConstantArgumentCheck.cpp:56
@@ +55,3 @@
+ << IsConstArg << IsVariable << IsTriviallyCopyable
+ << FixItHint::CreateRemoval(Lexer::makeFileCharRange(
+ CharSourceRange::getCharRange(CallMove->getLocStart(),
----------------
After some thinking, there may be cases where the range of the whole expression can be translated to a file char range, but a sub-range of it can't. So you need to check the validity of the results of both `makeFileCharRange` calls in this expression before creating a fixit hint with the resulting ranges.
Also, it seems reasonable to issue a warning in any case, and fix-it hints only when we are rather certain that we can apply them safely (which the validity of all `makeFileCharRange` results should tell us about).
================
Comment at: test/clang-tidy/move-const-arg.cpp:26
@@ +25,3 @@
+ return std::move(42);
+ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: std::move of the expression of
+ // trivially-copyable type has no effect; remove std::move().
----------------
I see that clang-format did a wrong thing here. It should have used the `tools/clang/tools/extra/test/.clang-format` configuration file containing the `ColumnLimit: 0` setting, which disables column limit enforcement. Please merge the `CHECK-MESSAGES` lines (otherwise, the second line is just ignored) and in the future use `clang-format -style=file` when reformatting test files.
Please also specify the full diagnostic message once including the [check-name]. The rest messages can be truncated to remove duplicating text (e.g. remove the `has no effect; remove std::move().` substring).
================
Comment at: test/clang-tidy/move-const-arg.cpp:54
@@ +53,3 @@
+
+template <typename T> T f6(const T x6) { return std::move(x6); }
+
----------------
Please add a test that insures that correct fixes are applied to template functions and only once, e.g. like this:
```
template <typename T> T f(const int x) {
return std::move(x);
// CHECK-FIXES: return x;
}
void g() {
f<int>(1);
f<double>(1);
}
```
http://reviews.llvm.org/D12031
More information about the cfe-commits
mailing list