From 9bb5685b21619fc0a292ff31a7d91d905440d4a9 Mon Sep 17 00:00:00 2001 From: Alex Cameron Date: Wed, 18 Mar 2020 21:38:33 +0000 Subject: [PATCH] [clang-tidy] misc-unconventional-assign-operator suggest to use rvalue references in C++03 mode Summary: Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=27702 I wasn't sure how this type of thing is usually tested. So any advice would be appreciated. `check-llvm`, `check-clang` and `check-clang-tools` are clean for me. **C++98** ``` tetsuo@garland-c-16-sgp1-01:~/dev/llvm-project/test$ cat compile_commands.json [ { "directory": "/home/tetsuo/dev/llvm-project/test", "command": "/usr/bin/c++ -std=gnu++98 -o CMakeFiles/test.dir/test.cpp.o -c /home/tetsuo/dev/llvm-project/test/test.cpp", "file": "/home/tetsuo/dev/llvm-project/test/test.cpp" } ] tetsuo@garland-c-16-sgp1-01:~/dev/llvm-project/test$ ../build/bin/clang-tidy --checks=misc-unconventional-assign-operator test.cpp 3053 warnings generated. /home/tetsuo/dev/llvm-project/test/test.cpp:7:3: warning: operator=() should take 'Foo const&' or 'Foo' [misc-unconventional-assign-operator] Foo &operator=(Foo &Other) { ^ Suppressed 3052 warnings (3052 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. ``` **C++17** ``` tetsuo@garland-c-16-sgp1-01:~/dev/llvm-project/test$ cat compile_commands.json [ { "directory": "/home/tetsuo/dev/llvm-project/test", "command": "/usr/bin/c++ -std=gnu++17 -o CMakeFiles/test.dir/test.cpp.o -c /home/tetsuo/dev/llvm-project/test/test.cpp", "file": "/home/tetsuo/dev/llvm-project/test/test.cpp" } ] tetsuo@garland-c-16-sgp1-01:~/dev/llvm-project/test$ ../build/bin/clang-tidy --checks=misc-unconventional-assign-operator test.cpp 5377 warnings generated. /home/tetsuo/dev/llvm-project/test/test.cpp:7:3: warning: operator=() should take 'Foo const&', 'Foo&&' or 'Foo' [misc-unconventional-assign-operator] Foo &operator=(Foo &Other) { ^ Suppressed 5376 warnings (5376 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. ``` Reviewers: njames93, MaskRay, alexfh, hokein, aaron.ballman Reviewed By: njames93 Subscribers: xazax.hun, cfe-commits Tags: #clang-tools-extra, #clang Differential Revision: https://reviews.llvm.org/D75901 --- .../clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp | 5 ++++- .../misc-unconventional-assign-operator-precxx11.cpp | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/misc-unconventional-assign-operator-precxx11.cpp diff --git a/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp index 93ccd5492af7..5fc973223ea3 100644 --- a/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp @@ -75,7 +75,10 @@ void UnconventionalAssignOperatorCheck::check( } else { static const char *const Messages[][2] = { {"ReturnType", "operator=() should return '%0&'"}, - {"ArgumentType", "operator=() should take '%0 const&', '%0&&' or '%0'"}, + {"ArgumentType", + getLangOpts().CPlusPlus11 + ? "operator=() should take '%0 const&', '%0&&' or '%0'" + : "operator=() should take '%0 const&' or '%0'"}, {"cv", "operator=() should not be marked '%1'"}}; const auto *Method = Result.Nodes.getNodeAs("method"); diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc-unconventional-assign-operator-precxx11.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc-unconventional-assign-operator-precxx11.cpp new file mode 100644 index 000000000000..7dc939955f37 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/misc-unconventional-assign-operator-precxx11.cpp @@ -0,0 +1,6 @@ +// RUN: %check_clang_tidy -std=c++98,c++03 %s misc-unconventional-assign-operator %t + +struct BadArgument { + BadArgument &operator=(BadArgument &); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: operator=() should take 'BadArgument const&' or 'BadArgument' +};