<div style="font-family: arial, helvetica, sans-serif; font-size: 10pt">I just used the assignment operator as an example of a method in a class that would return an instance of the class. If there is some member function that returns an instance of the class that really should be used, the function can still be explicitly annotated. The idea being to not surprise users with bizarre warnings such as not using the return value of an operator= or operator<<, and to allow the attribute to be applied to existing classes that shouldn't be ignored as return values but can/will be assigned, copied, etc without having to go through and annotate all of the member functions that return an instance of the class with an attribute to disable unused result checking.<br>
<br><div class="gmail_quote">On Tue, Nov 13, 2012 at 1:40 PM, Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
That doesn't seem right. Factory methods? operator-? I think assignment operators are the special case, not 'returning an instance'.<br>
<br>
…except for operator<< on streams. Hm.<br>
<span class="HOEnZb"><font color="#888888"><br>
Jordan<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On Nov 13, 2012, at 13:23 , Kaelyn Uhrain <<a href="mailto:rikka@google.com">rikka@google.com</a>> wrote:<br>
<br>
> Author: rikka<br>
> Date: Tue Nov 13 15:23:31 2012<br>
> New Revision: 167873<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=167873&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=167873&view=rev</a><br>
> Log:<br>
> For classes that have the warn_unused_result attribute, don't apply the<br>
> attribute to the class' methods even when they return an instance of the<br>
> class (e.g. assignment operators).<br>
><br>
> Modified:<br>
>    cfe/trunk/lib/Sema/SemaDecl.cpp<br>
>    cfe/trunk/test/SemaCXX/warn-unused-result.cpp<br>
><br>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=167873&r1=167872&r2=167873&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=167873&r1=167872&r2=167873&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)<br>
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Nov 13 15:23:31 2012<br>
> @@ -5696,7 +5696,11 @@<br>
>       RetType->getAsCXXRecordDecl() : RetType->getPointeeCXXRecordDecl();<br>
>   if (!NewFD->isInvalidDecl() && !NewFD->hasAttr<WarnUnusedResultAttr>() &&<br>
>       Ret && Ret->hasAttr<WarnUnusedResultAttr>()) {<br>
> -    NewFD->addAttr(new (Context) WarnUnusedResultAttr(SourceRange(), Context));<br>
> +    const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);<br>
> +    if (!(MD && MD->getCorrespondingMethodInClass(Ret, true))) {<br>
> +      NewFD->addAttr(new (Context) WarnUnusedResultAttr(SourceRange(),<br>
> +                                                        Context));<br>
> +    }<br>
>   }<br>
><br>
>   if (!getLangOpts().CPlusPlus) {<br>
><br>
> Modified: cfe/trunk/test/SemaCXX/warn-unused-result.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-result.cpp?rev=167873&r1=167872&r2=167873&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-result.cpp?rev=167873&r1=167872&r2=167873&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/SemaCXX/warn-unused-result.cpp (original)<br>
> +++ cfe/trunk/test/SemaCXX/warn-unused-result.cpp Tue Nov 13 15:23:31 2012<br>
> @@ -46,6 +46,12 @@<br>
> namespace warn_unused_CXX11 {<br>
> struct [[clang::warn_unused_result]] Status {<br>
>   bool ok() const;<br>
> +  Status& operator=(const Status& x);<br>
> +  inline void Update(const Status& new_status) {<br>
> +    if (ok()) {<br>
> +      *this = new_status; //no-warning<br>
> +    }<br>
> +  }<br>
> };<br>
> Status DoSomething();<br>
> Status& DoSomethingElse();<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
</div></div></blockquote></div><br></div>