That doesn't seem right. Factory methods? operator-? I think assignment operators are the special case, not 'returning an instance'.
…except for operator<< on streams. Hm. Jordan On Nov 13, 2012, at 13:23 , Kaelyn Uhrain <[email protected]> wrote: > Author: rikka > Date: Tue Nov 13 15:23:31 2012 > New Revision: 167873 > > URL: http://llvm.org/viewvc/llvm-project?rev=167873&view=rev > Log: > For classes that have the warn_unused_result attribute, don't apply the > attribute to the class' methods even when they return an instance of the > class (e.g. assignment operators). > > Modified: > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/test/SemaCXX/warn-unused-result.cpp > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=167873&r1=167872&r2=167873&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Nov 13 15:23:31 2012 > @@ -5696,7 +5696,11 @@ > RetType->getAsCXXRecordDecl() : RetType->getPointeeCXXRecordDecl(); > if (!NewFD->isInvalidDecl() && !NewFD->hasAttr<WarnUnusedResultAttr>() && > Ret && Ret->hasAttr<WarnUnusedResultAttr>()) { > - NewFD->addAttr(new (Context) WarnUnusedResultAttr(SourceRange(), > Context)); > + const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD); > + if (!(MD && MD->getCorrespondingMethodInClass(Ret, true))) { > + NewFD->addAttr(new (Context) WarnUnusedResultAttr(SourceRange(), > + Context)); > + } > } > > if (!getLangOpts().CPlusPlus) { > > 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=167873&r1=167872&r2=167873&view=diff > ============================================================================== > --- cfe/trunk/test/SemaCXX/warn-unused-result.cpp (original) > +++ cfe/trunk/test/SemaCXX/warn-unused-result.cpp Tue Nov 13 15:23:31 2012 > @@ -46,6 +46,12 @@ > namespace warn_unused_CXX11 { > struct [[clang::warn_unused_result]] Status { > bool ok() const; > + Status& operator=(const Status& x); > + inline void Update(const Status& new_status) { > + if (ok()) { > + *this = new_status; //no-warning > + } > + } > }; > Status DoSomething(); > Status& DoSomethingElse(); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
