Author: erichkeane Date: Wed Apr 19 16:24:55 2017 New Revision: 300764 URL: http://llvm.org/viewvc/llvm-project?rev=300764&view=rev Log: Corrrect warn_unused_result attribute
The original idea was that if the attribute on an operator, that the return-value unused-ness wouldn't matter. However, all of the operators except postfix inc/dec return references! References don't result in this warning anyway, so those are already excluded. Differential Revision: https://reviews.llvm.org/D32207 Modified: cfe/trunk/include/clang/AST/Decl.h cfe/trunk/lib/AST/Decl.cpp cfe/trunk/test/SemaCXX/warn-unused-result.cpp Modified: cfe/trunk/include/clang/AST/Decl.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=300764&r1=300763&r2=300764&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/Decl.h (original) +++ cfe/trunk/include/clang/AST/Decl.h Wed Apr 19 16:24:55 2017 @@ -2082,10 +2082,7 @@ public: const Attr *getUnusedResultAttr() const; /// \brief Returns true if this function or its return type has the - /// warn_unused_result attribute. If the return type has the attribute and - /// this function is a method of the return type's class, then false will be - /// returned to avoid spurious warnings on member methods such as assignment - /// operators. + /// warn_unused_result attribute. bool hasUnusedResultAttr() const { return getUnusedResultAttr() != nullptr; } /// \brief Returns the storage class as written in the source. For the Modified: cfe/trunk/lib/AST/Decl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=300764&r1=300763&r2=300764&view=diff ============================================================================== --- cfe/trunk/lib/AST/Decl.cpp (original) +++ cfe/trunk/lib/AST/Decl.cpp Wed Apr 19 16:24:55 2017 @@ -3003,9 +3003,7 @@ SourceRange FunctionDecl::getExceptionSp const Attr *FunctionDecl::getUnusedResultAttr() const { QualType RetType = getReturnType(); if (RetType->isRecordType()) { - const CXXRecordDecl *Ret = RetType->getAsCXXRecordDecl(); - const auto *MD = dyn_cast<CXXMethodDecl>(this); - if (Ret && !(MD && MD->getCorrespondingMethodInClass(Ret, true))) { + if (const CXXRecordDecl *Ret = RetType->getAsCXXRecordDecl()) { if (const auto *R = Ret->getAttr<WarnUnusedResultAttr>()) return R; } Modified: cfe/trunk/test/SemaCXX/warn-unused-result.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-result.cpp?rev=300764&r1=300763&r2=300764&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/warn-unused-result.cpp (original) +++ cfe/trunk/test/SemaCXX/warn-unused-result.cpp Wed Apr 19 16:24:55 2017 @@ -160,3 +160,49 @@ void g() { (void)noexcept(f(), false); // Should not warn. } } + +namespace { +// C++ Methods should warn even in their own class. +struct [[clang::warn_unused_result]] S { + S DoThing() { return {}; }; + S operator++(int) { return {}; }; + S operator--(int) { return {}; }; + // Improperly written prefix. + S operator++() { return {}; }; + S operator--() { return {}; }; +}; + +struct [[clang::warn_unused_result]] P { + P DoThing() { return {}; }; +}; + +P operator++(const P &, int) { return {}; }; +P operator--(const P &, int) { return {}; }; +// Improperly written prefix. +P operator++(const P &) { return {}; }; +P operator--(const P &) { return {}; }; + +void f() { + S s; + P p; + s.DoThing(); // expected-warning {{ignoring return value}} + p.DoThing(); // expected-warning {{ignoring return value}} + // Only postfix is expected to warn when written correctly. + s++; // expected-warning {{ignoring return value}} + s--; // expected-warning {{ignoring return value}} + p++; // expected-warning {{ignoring return value}} + p--; // expected-warning {{ignoring return value}} + // Improperly written prefix operators should still warn. + ++s; // expected-warning {{ignoring return value}} + --s; // expected-warning {{ignoring return value}} + ++p; // expected-warning {{ignoring return value}} + --p; // expected-warning {{ignoring return value}} + + // Silencing the warning by cast to void still works. + (void)s.DoThing(); + (void)s++; + (void)p++; + (void)++s; + (void)++p; +} +} // namespace _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits