Hi Jonas,
Don't know how to attach another patch to Phabricator, but I have added some tests that fail.
Happy New Year! florin On 12/31/19 10:11 AM, Jonas Toth via Phabricator wrote:
JonasToth updated this revision to Diff 235712. JonasToth added a comment. - fix error from macro-defined variables - move test files in sub-directory - fix false positive of news in type-dependent contextes - add a true positive in typedependent context - update to latest utility version Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D54943/new/ https://reviews.llvm.org/D54943 Files: clang-tools-extra/clang-tidy/cppcoreguidelines/CMakeLists.txt clang-tools-extra/clang-tidy/cppcoreguidelines/ConstCorrectnessCheck.cpp clang-tools-extra/clang-tidy/cppcoreguidelines/ConstCorrectnessCheck.h clang-tools-extra/clang-tidy/cppcoreguidelines/CppCoreGuidelinesTidyModule.cpp clang-tools-extra/clang-tidy/performance/ForRangeCopyCheck.cpp clang-tools-extra/clang-tidy/performance/UnnecessaryCopyInitialization.cpp clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp clang-tools-extra/clang-tidy/utils/FixItHintUtils.cpp clang-tools-extra/clang-tidy/utils/FixItHintUtils.h clang-tools-extra/clang-tidy/utils/LexerUtils.cpp clang-tools-extra/clang-tidy/utils/LexerUtils.h clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines-const-correctness.rst clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-pointer-as-values.cpp clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-transform-pointer-as-values.cpp clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-transform-values.cpp clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-values.cpp clang-tools-extra/unittests/clang-tidy/AddConstTest.cpp clang-tools-extra/unittests/clang-tidy/CMakeLists.txt clang/lib/Analysis/ExprMutationAnalyzer.cpp clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp
>From 4cfb85cf652996211d57176a2cb3a17e43102dcf Mon Sep 17 00:00:00 2001 From: Florin Iucha <flo...@iucha.net> Date: Mon, 30 Dec 2019 17:20:35 -0500 Subject: [PATCH] Add extra tests --- ...oreguidelines-const-correctness-values.cpp | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-values.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-values.cpp index 8f7692fb7fe..572b29fc24c 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-values.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-const-correctness-values.cpp @@ -574,3 +574,168 @@ void placement_new_in_unique_ptr() { int np_local0 = p_local0; new to_construct<T>(np_local0); } + +// Test bit fields +struct HardwareRegister { + unsigned field: 5; + unsigned : 7; + unsigned another: 20; +}; + +void TestRegisters () { + HardwareRegister np_reg0; + np_reg0.field = 3; + + HardwareRegister p_reg1{ 3, 22 }; + // CHECK-MESSAGES: [[@LINE-1]]:4: warning: variable 'p_reg1' of type 'HardwareRegister' can be declared 'const' + const unsigned p_val = p_reg1.another; +} + +struct IntMaker +{ + operator bool() const; +}; + +IntMaker& operator>>(IntMaker&, int&); + +int TestExtractionOperator() +{ + int np_foo; + IntMaker np_maker; + + if (np_maker >> np_foo) { + return np_foo + 2; + } + + int np_bar; + np_maker >> np_bar; + return np_bar; +} + +template <typename L, typename R> +struct MyPair +{ + L left; + R right; + + MyPair(const L& ll, const R& rr) : left{ll}, right{rr} {} +}; + +template <typename K, typename V> +class MyDict +{ + public: + static constexpr int initial_size = 16; + + ~MyDict() { + if (items) { + delete[] items; + } + } + + struct value_type + { + K kk; + V vv; + }; + + using iterator = value_type*; + + iterator begin() { return items; } + iterator end() { return items + used; } + + iterator cbegin() const { return items; } + iterator cend() const { return items + used; } + + void emplace(K kk, V vv) { + if (! items) { + count = initial_size; + items = new value_type[count]; + } + else { + if (count == used) { + const auto old = items; + count += initial_size; + items = new value_type[count]; + for (int ii = 0; ii < used; ++ ii) { + items[ii] = old[ii]; + } + } + } + items[used].kk = kk; + items[used].vv = vv; + ++ used; + } + + private: + + value_type* items = nullptr; + int count = 0; + int used = 0; +}; + +MyDict<int, int> MakeDict() +{ + MyDict<int, int> np_dict; + + np_dict.emplace(3, 4); + np_dict.emplace(23, 445); + + return np_dict; +} + +void TestDict() +{ + auto np_dict = MakeDict(); + + for (auto& np_el: np_dict) + { + np_el.vv += 2; + } +} + +MyDict<double, double> MakeOtherDict() +{ + MyDict<double, double> np_dict; + + np_dict.emplace(3., 4.); + np_dict.emplace(23., 445.); + + return np_dict; +} + +void TestZipIterators() +{ + const auto p_dict = MakeDict(); + auto np_other_dict = MakeOtherDict(); + + // false-positive! iterators can't be const, since we're incrementing them + for (auto [np_left, np_right] = MyPair<MyDict<int,int>::iterator, MyDict<double,double>::iterator>{p_dict.cbegin(), np_other_dict.begin()}; np_left != p_dict.cend(); ++np_left, ++np_right) { + np_right->vv += np_left->vv; + } +} + +struct Actuator +{ + int actuations; +}; + +struct Sensor +{ + int observations; +}; + +struct System : public Actuator, public Sensor +{ +}; + +int SomeComputation(int arg); + +int TestInheritance() +{ + // false-positive! + System np_sys; + np_sys.actuations = 5; + + return SomeComputation(np_sys.actuations); +} -- 2.20.1
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits