<div dir="ltr"><div>The previous implementation would copy the attribute from the class to </div><div>functions that have the class as their return type when the functions </div><div>are first declared. This proved to have two flaws:</div><div>  1) if the class is forward-declared without the attribute and a </div><div>     function or method with the class as a its return type is declared,</div><div>     and afterward the class is defined with warn_unused_result, the </div><div>     function or method would never inherit the attribute, and</div><div>  2) the check simply failed for functions and methods that are part of</div><div>     a template instantiation, regardless of whether the class with </div><div>     warn_unused_result is part of a specific instantiation or part of </div><div>     the template itself (presumably because those function/method </div><div>     declaration does not hit the same code path as a non-template one </div><div>     and so never inherits the attribute).</div><div><br></div><div>The new approach is to instead modify the two places where a function or</div><div>method call is checked for the warn_unused_result attribute on the decl </div><div>by extending the checks to also look for the attribute on the decl's </div><div>return type.</div><div></commit-message></div><div><br></div><div>I've unified the two locations that performed the check into a helper method of FunctionDecl that returns true if the decl or its return type have the warn_unused_result attribute, except if only the return type has the attribute and the decl is a member of the return type (which avoids spurious messages on e.g. assignment operators).</div><div><br></div><div>Cheers,</div><div>Kaelyn</div></div>