diff options
author | Malcolm Parsons <malcolm.parsons@gmail.com> | 2017-02-15 14:01:41 +0000 |
---|---|---|
committer | Malcolm Parsons <malcolm.parsons@gmail.com> | 2017-02-15 14:01:41 +0000 |
commit | 51642f9d0adad04a7693a1a505d247690e408c6b (patch) | |
tree | aa84bfb11fa637e26e9922b3419d488558420064 | |
parent | d717ce580b2c95951a812eff13ce1d3aebc2ee35 (diff) | |
download | bcm5719-llvm-51642f9d0adad04a7693a1a505d247690e408c6b.tar.gz bcm5719-llvm-51642f9d0adad04a7693a1a505d247690e408c6b.zip |
[clang-tidy] Don't warn about call to unresolved operator*
Summary:
The misc-unconventional-assign-operator check had a false positive
warning when the 'operator*' in 'return *this' was unresolved.
Change matcher to allow calls to unresolved operator.
Fixes PR31531.
Reviewers: alexfh, aaron.ballman
Subscribers: JDevlieghere, cfe-commits
Differential Revision: https://reviews.llvm.org/D29393
llvm-svn: 295176
-rw-r--r-- | clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp | 5 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-unconventional-assign-operator.cpp | 22 |
2 files changed, 26 insertions, 1 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp b/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp index 841f13d52a5..cde631e0aa7 100644 --- a/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/UnconventionalAssignOperatorCheck.cpp @@ -58,7 +58,10 @@ void UnconventionalAssignOperatorCheck::registerMatchers( this); const auto IsBadReturnStatement = returnStmt(unless(has(ignoringParenImpCasts( - unaryOperator(hasOperatorName("*"), hasUnaryOperand(cxxThisExpr())))))); + anyOf(unaryOperator(hasOperatorName("*"), hasUnaryOperand(cxxThisExpr())), + cxxOperatorCallExpr(argumentCountIs(1), + callee(unresolvedLookupExpr()), + hasArgument(0, cxxThisExpr()))))))); const auto IsGoodAssign = cxxMethodDecl(IsAssign, HasGoodReturnType); Finder->addMatcher(returnStmt(IsBadReturnStatement, forFunction(IsGoodAssign)) diff --git a/clang-tools-extra/test/clang-tidy/misc-unconventional-assign-operator.cpp b/clang-tools-extra/test/clang-tidy/misc-unconventional-assign-operator.cpp index 7ad9610ea94..729b7d50a88 100644 --- a/clang-tools-extra/test/clang-tidy/misc-unconventional-assign-operator.cpp +++ b/clang-tools-extra/test/clang-tidy/misc-unconventional-assign-operator.cpp @@ -87,3 +87,25 @@ public: return n; } }; + +namespace pr31531 { +enum E { e }; +// This declaration makes the 'return *this' below have an unresolved operator +// in the class template, but not in an instantiation. +E operator*(E, E); + +template <typename> +struct UnresolvedOperator { + UnresolvedOperator &operator=(const UnresolvedOperator &) { return *this; } +}; + +UnresolvedOperator<int> UnresolvedOperatorInt; + +template <typename> +struct Template { + Template &operator=(const Template &) { return this; } + // CHECK-MESSAGES: :[[@LINE-1]]:43: warning: operator=() should always return '*this' +}; + +Template<int> TemplateInt; +} |