flx created this revision. flx added reviewers: sbenza, alexfh, hokein. flx added a subscriber: cfe-commits. flx set the repository for this revision to rL LLVM. flx added a project: clang-tools-extra. Herald added a subscriber: JDevlieghere.
Virtual method overrides of dependent types cannot be recognized unless they are marked as override or final. Exclude methods marked as final from check and add test. Repository: rL LLVM https://reviews.llvm.org/D27248 Files: clang-tidy/performance/UnnecessaryValueParamCheck.cpp test/clang-tidy/performance-unnecessary-value-param.cpp Index: test/clang-tidy/performance-unnecessary-value-param.cpp =================================================================== --- test/clang-tidy/performance-unnecessary-value-param.cpp +++ test/clang-tidy/performance-unnecessary-value-param.cpp @@ -271,3 +271,21 @@ void ReferenceFunctionByCallingIt() { PositiveMessageAndFixAsFunctionIsCalled(ExpensiveToCopyType()); } + +// Virtual method overrides of dependent types cannot be recognized unless they +// are marked as override or final. Test that check is not triggered on methods +// marked with override or final. +template <typename T> +struct NegativeDependentTypeInterface { + virtual void Method(ExpensiveToCopyType E) = 0; +}; + +template <typename T> +struct NegativOverrideImpl : public NegativeDependentTypeInterface<T> { + void Method(ExpensiveToCopyType E) override {} +}; + +template <typename T> +struct NegativFinalImpl : public NegativeDependentTypeInterface<T> { + void Method(ExpensiveToCopyType E) final {} +}; Index: clang-tidy/performance/UnnecessaryValueParamCheck.cpp =================================================================== --- clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -61,7 +61,8 @@ unless(referenceType())))), decl().bind("param")); Finder->addMatcher( - functionDecl(isDefinition(), unless(cxxMethodDecl(isOverride())), + functionDecl(isDefinition(), + unless(cxxMethodDecl(anyOf(isOverride(), isFinal()))), unless(isInstantiated()), has(typeLoc(forEach(ExpensiveValueParamDecl))), decl().bind("functionDecl")),
Index: test/clang-tidy/performance-unnecessary-value-param.cpp =================================================================== --- test/clang-tidy/performance-unnecessary-value-param.cpp +++ test/clang-tidy/performance-unnecessary-value-param.cpp @@ -271,3 +271,21 @@ void ReferenceFunctionByCallingIt() { PositiveMessageAndFixAsFunctionIsCalled(ExpensiveToCopyType()); } + +// Virtual method overrides of dependent types cannot be recognized unless they +// are marked as override or final. Test that check is not triggered on methods +// marked with override or final. +template <typename T> +struct NegativeDependentTypeInterface { + virtual void Method(ExpensiveToCopyType E) = 0; +}; + +template <typename T> +struct NegativOverrideImpl : public NegativeDependentTypeInterface<T> { + void Method(ExpensiveToCopyType E) override {} +}; + +template <typename T> +struct NegativFinalImpl : public NegativeDependentTypeInterface<T> { + void Method(ExpensiveToCopyType E) final {} +}; Index: clang-tidy/performance/UnnecessaryValueParamCheck.cpp =================================================================== --- clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -61,7 +61,8 @@ unless(referenceType())))), decl().bind("param")); Finder->addMatcher( - functionDecl(isDefinition(), unless(cxxMethodDecl(isOverride())), + functionDecl(isDefinition(), + unless(cxxMethodDecl(anyOf(isOverride(), isFinal()))), unless(isInstantiated()), has(typeLoc(forEach(ExpensiveValueParamDecl))), decl().bind("functionDecl")),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits