Index: test/clang-tidy/check_clang_tidy_fix.sh =================================================================== --- test/clang-tidy/check_clang_tidy_fix.sh +++ test/clang-tidy/check_clang_tidy_fix.sh @@ -6,9 +6,9 @@ CHECK_TO_RUN=$2 TEMPORARY_FILE=$3.cpp -grep -Ev "// *[A-Z-]+:" ${INPUT_FILE} > ${TEMPORARY_FILE} +sed 's#// *[A-Z-]\+:.*#//#' ${INPUT_FILE} > ${TEMPORARY_FILE} clang-tidy ${TEMPORARY_FILE} -fix --checks="-*,${CHECK_TO_RUN}" -- --std=c++11 > ${TEMPORARY_FILE}.msg 2>&1 FileCheck -input-file=${TEMPORARY_FILE} ${INPUT_FILE} -strict-whitespace || exit $? -if grep CHECK-MESSAGES ${INPUT_FILE}; then +if grep -q CHECK-MESSAGES ${INPUT_FILE}; then FileCheck -input-file=${TEMPORARY_FILE}.msg ${INPUT_FILE} -check-prefix=CHECK-MESSAGES || exit $? fi Index: test/clang-tidy/check_clang_tidy_output.sh =================================================================== --- test/clang-tidy/check_clang_tidy_output.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# -# Run clang-tidy and verify its command line output. - -INPUT_FILE=$1 -CHECK_TO_RUN=$2 - -clang-tidy --checks="-*,${CHECK_TO_RUN}" ${INPUT_FILE} -- --std=c++11 -x c++ \ - | FileCheck ${INPUT_FILE} Index: test/clang-tidy/redundant-smartptr-get-fix.cpp =================================================================== --- test/clang-tidy/redundant-smartptr-get-fix.cpp +++ test/clang-tidy/redundant-smartptr-get-fix.cpp @@ -1,6 +1,8 @@ // RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-redundant-smartptr-get %t // REQUIRES: shell +// CHECK-MESSAGES-NOT: warning + namespace std { template @@ -34,33 +36,96 @@ int& operator*(); }; +struct Fail1 { + Bar* get(); +}; +struct Fail2 { + Bar* get(); + int* operator->(); + int& operator*(); +}; + void Positive() { BarPtr u; // CHECK: BarPtr u; BarPtr().get()->Do(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. [misc-redundant-smartptr-get] + // CHECK-MESSAGES: BarPtr().get()->Do(); // CHECK: BarPtr()->Do(); u.get()->ConstDo(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: u.get()->ConstDo(); // CHECK: u->ConstDo(); Bar& b = *BarPtr().get(); + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: Bar& b = *BarPtr().get(); // CHECK: Bar& b = *BarPtr(); + Bar& b2 = *std::unique_ptr().get(); + // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: Bar& b2 = *std::unique_ptr().get(); + // CHECK: Bar& b2 = *std::unique_ptr(); + (*BarPtr().get()).ConstDo(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: (*BarPtr().get()).ConstDo(); // CHECK: (*BarPtr()).ConstDo(); - BarPtr* up; + (*std::unique_ptr().get()).ConstDo(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: (*std::unique_ptr().get()).ConstDo(); + // CHECK: (*std::unique_ptr()).ConstDo(); + + std::unique_ptr* up; (*up->get()).Do(); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: (*up->get()).Do(); // CHECK: (**up).Do(); int_ptr ip; int i = *ip.get(); + // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: int i = *ip.get(); // CHECK: int i = *ip; std::unique_ptr uu; std::shared_ptr *ss; bool bb = uu.get() == nullptr; + // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: uu.get() == nullptr; // CHECK: bool bb = uu == nullptr; + bb = nullptr != ss->get(); + // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: Redundant get() call on smart pointer. + // CHECK-MESSAGES: nullptr != ss->get(); // CHECK: bb = nullptr != *ss; } + +// CHECK-MESSAGES-NOT: warning: + +void Negative() { + struct NegPtr { + int* get(); + int* operator->() { + return &*this->get(); + } + int& operator*() { + return *get(); + } + }; + + std::unique_ptr* u; + u->get()->Do(); + + Fail1().get()->Do(); + Fail2().get()->Do(); + const Bar& b = *Fail1().get(); + (*Fail2().get()).Do(); + + int_ptr ip; + bool bb = std::unique_ptr().get() == NULL; + bb = ip.get() == nullptr; + bb = u->get() == NULL; +} Index: test/clang-tidy/redundant-smartptr-get.cpp =================================================================== --- test/clang-tidy/redundant-smartptr-get.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// RUN: $(dirname %s)/check_clang_tidy_output.sh %s misc-redundant-smartptr-get -// REQUIRES: shell - -// CHECK-NOT: warning - -namespace std { - -template -struct unique_ptr { - T& operator*() const; - T* operator->() const; - T* get() const; -}; - -template -struct shared_ptr { - T& operator*() const; - T* operator->() const; - T* get() const; -}; - -} // namespace std -#define NULL __null - -struct int_ptr { - int* get(); - int* operator->(); - int& operator*(); -}; - -struct Bar { - void Do(); - void ConstDo() const; -}; - -struct Fail1 { - Bar* get(); -}; -struct Fail2 { - Bar* get(); - int* operator->(); - int& operator*(); -}; - -void Positive() { - std::unique_ptr u; - std::unique_ptr().get()->Do(); - // CHECK: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. [misc-redundant-smartptr-get] - // CHECK: std::unique_ptr().get()->Do(); - - u.get()->ConstDo(); - // CHECK: :[[@LINE-1]]:3: warning: Redundant get() call on smart pointer. - // CHECK: u.get()->ConstDo(); - - Bar& b = *std::unique_ptr().get(); - // CHECK: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. - // CHECK: Bar& b = *std::unique_ptr().get(); - - (*std::unique_ptr().get()).ConstDo(); - // CHECK: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. - // CHECK: (*std::unique_ptr().get()).ConstDo(); - - std::unique_ptr* up; - (*up->get()).Do(); - // CHECK: :[[@LINE-1]]:5: warning: Redundant get() call on smart pointer. - // CHECK: (*up->get()).Do(); - - int_ptr ip; - int i = *ip.get(); - // CHECK: :[[@LINE-1]]:12: warning: Redundant get() call on smart pointer. - // CHECK: int i = *ip.get(); - - bool bb = u.get() == nullptr; - // CHECK: :[[@LINE-1]]:13: warning: Redundant get() call on smart pointer. - // CHECK: u.get() == nullptr; - std::shared_ptr *sp; - bb = nullptr != sp->get(); - // CHECK: :[[@LINE-1]]:19: warning: Redundant get() call on smart pointer. - // CHECK: nullptr != sp->get(); -} - -// CHECK-NOT: warning: - -void Negative() { - struct NegPtr { - int* get(); - int* operator->() { - return &*this->get(); - } - int& operator*() { - return *get(); - } - }; - - std::unique_ptr* u; - u->get()->Do(); - - Fail1().get()->Do(); - Fail2().get()->Do(); - const Bar& b = *Fail1().get(); - (*Fail2().get()).Do(); - - int_ptr ip; - bool bb = std::unique_ptr().get() == NULL; - bb = ip.get() == nullptr; - bb = u->get() == NULL; -} Index: test/clang-tidy/use-override-fix.cpp =================================================================== --- test/clang-tidy/use-override-fix.cpp +++ test/clang-tidy/use-override-fix.cpp @@ -1,6 +1,8 @@ // RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-use-override %t // REQUIRES: shell +// CHECK-MESSAGES-NOT: warning: + #define ABSTRACT = 0 #define OVERRIDE override @@ -32,35 +34,56 @@ struct SimpleCases : public Base { public: virtual ~SimpleCases(); + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using 'override' or 'final' instead of 'virtual' // CHECK: {{^ ~SimpleCases\(\) override;}} void a(); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: Use exactly // CHECK: {{^ void a\(\) override;}} + void b() override; + // CHECK-MESSAGES-NOT: warning: // CHECK: {{^ void b\(\) override;}} + virtual void c(); + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void c\(\) override;}} + virtual void d() override; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ void d\(\) override;}} virtual void e() = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void e\(\) override = 0;}} + virtual void f()=0; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void f\(\)override =0;}} + virtual void g() ABSTRACT; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void g\(\) override ABSTRACT;}} virtual void j() const; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void j\(\) const override;}} + virtual MustUseResultObject k(); // Has an implicit attribute. + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: Prefer using // CHECK: {{^ MustUseResultObject k\(\) override;}} + virtual bool l() MUST_USE_RESULT; // Has an explicit attribute + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ bool l\(\) override MUST_USE_RESULT;}} virtual void m() override final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ void m\(\) final;}} }; +// CHECK-MESSAGES-NOT: warning: + void SimpleCases::i() {} // CHECK: {{^void SimpleCases::i\(\) {}}} @@ -70,47 +93,69 @@ struct DefaultedDestructor : public Base { DefaultedDestructor() {} virtual ~DefaultedDestructor() = default; + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using // CHECK: {{^ ~DefaultedDestructor\(\) override = default;}} }; struct FinalSpecified : public Base { public: virtual ~FinalSpecified() final; + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Use exactly // CHECK: {{^ ~FinalSpecified\(\) final;}} void b() final; + // CHECK-MESSAGES-NOT: warning: // CHECK: {{^ void b\(\) final;}} + virtual void d() final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ void d\(\) final;}} virtual void e() final = 0; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ void e\(\) final = 0;}} virtual void j() const final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ void j\(\) const final;}} + virtual bool l() final MUST_USE_RESULT; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ bool l\(\) final MUST_USE_RESULT;}} }; struct InlineDefinitions : public Base { public: virtual ~InlineDefinitions() {} + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using // CHECK: {{^ ~InlineDefinitions\(\) override {}}} void a() {} + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: Use exactly // CHECK: {{^ void a\(\) override {}}} + void b() override {} + // CHECK-MESSAGES-NOT: warning: // CHECK: {{^ void b\(\) override {}}} + virtual void c() {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void c\(\) override {}}} + virtual void d() override {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ void d\(\) override {}}} virtual void j() const {} + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ void j\(\) const override {}}} + virtual MustUseResultObject k() {} // Has an implicit attribute. + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: Prefer using // CHECK: {{^ MustUseResultObject k\(\) override {}}} + virtual bool l() MUST_USE_RESULT {} // Has an explicit attribute + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ bool l\(\) override MUST_USE_RESULT {}}} }; @@ -118,15 +163,19 @@ // Tests for 'virtual' and 'override' being defined through macros. Basically // give up for now. NOT_VIRTUAL void a() NOT_OVERRIDE; + // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: Use exactly // CHECK: {{^ NOT_VIRTUAL void a\(\) override NOT_OVERRIDE;}} VIRTUAL void b() NOT_OVERRIDE; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Prefer using // CHECK: {{^ VIRTUAL void b\(\) override NOT_OVERRIDE;}} NOT_VIRTUAL void c() OVERRIDE; + // CHECK-MESSAGES-NOT: warning: // CHECK: {{^ NOT_VIRTUAL void c\(\) OVERRIDE;}} VIRTUAL void d() OVERRIDE; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ VIRTUAL void d\(\) OVERRIDE;}} #define FUNC(name, return_type) return_type name() @@ -138,6 +187,7 @@ // CHECK: {{^ F}} VIRTUAL void g() OVERRIDE final; + // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: Use exactly // CHECK: {{^ VIRTUAL void g\(\) final;}} }; @@ -155,6 +205,7 @@ template struct UnusedMemberInstantiation : public C { virtual ~UnusedMemberInstantiation() {} + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Prefer using // CHECK: {{^ ~UnusedMemberInstantiation\(\) override {}}} }; struct IntantiateWithoutUse : public UnusedMemberInstantiation {}; @@ -164,7 +215,10 @@ template struct MembersOfSpecializations : public Base { void a() override; + // CHECK-MESSAGES-NOT: warning: // CHECK: {{^ void a\(\) override;}} }; template <> void MembersOfSpecializations<3>::a() {} void f() { MembersOfSpecializations<3>().a(); }; + +// CHECK-MESSAGES-NOT: warning: Index: test/clang-tidy/use-override.cpp =================================================================== --- test/clang-tidy/use-override.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// RUN: $(dirname %s)/check_clang_tidy_output.sh %s misc-use-override %t -// REQUIRES: shell - -struct Base { - virtual ~Base() {} - virtual void a(); - virtual void b(); - virtual void c(); - virtual void d(); - virtual void e(); - virtual void f(); -}; - -struct SimpleCases : public Base { -public: - virtual ~SimpleCases() {} - // CHECK: :[[@LINE-1]]:11: warning: Prefer using 'override' or 'final' instead of 'virtual' - - void a(); - // CHECK: :[[@LINE-1]]:8: warning: Use exactly - virtual void b(); - // CHECK: :[[@LINE-1]]:16: warning: Prefer using - virtual void c() override; - // CHECK: :[[@LINE-1]]:16: warning: Use exactly - void d() override final; - // CHECK: :[[@LINE-1]]:8: warning: Use exactly - void e() override; - // CHECK-NOT: :[[@LINE-1]]:{{.*}} warning: - void f() final; - // CHECK-NOT: :[[@LINE-1]]:{{.*}} warning: -};