<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Aug 24, 2015 at 3:36 PM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron.ballman@gmail.com" target="_blank">aaron.ballman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Mon, Aug 24, 2015 at 6:29 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:<br>
> On Mon, Aug 24, 2015 at 3:23 PM, Aaron Ballman <<a href="mailto:aaron.ballman@gmail.com">aaron.ballman@gmail.com</a>><br>
> wrote:<br>
>><br>
>> aaron.ballman created this revision.<br>
>> aaron.ballman added reviewers: alexfh, rsmith.<br>
>> aaron.ballman added a subscriber: cfe-commits.<br>
>><br>
>> Per [except.handle]p10, the handler for a constructor or destructor<br>
>> function-try-block cannot refer to a non-static member of the object under<br>
>> construction. This patch adds a new clang-tidy check that warns the user<br>
>> when they've hit this undefined behavior.<br>
>><br>
>> Due to how infrequent function-try-blocks appear on constructors and<br>
>> destructors in the wild compared to how often member expressions are<br>
>> encountered, I felt this was more appropriate as a clang-tidy check than as<br>
>> a semantic warning. I was concerned with efficiency of checking whether an<br>
>> arbitrary member expression was referring to the object under<br>
>> construction/destruction within the function-try-block catch handler scope.<br>
><br>
><br>
> Seems like this would be very cheap to check in the case where the object<br>
> expression is an implicit or explicit CXXThisExpr. It'd be good to have a<br>
> frontend warning for that case.<br>
<br>
</span>Are you thinking the check would likely in BuildMemberReferenceExpr()<br>
and I would just have to look at the current scope to determine<br>
whether it's a function-try-block catch handler?</blockquote><div><br></div><div>Yes, somewhere around there. You might need to wire a Scope* though a couple of layers though.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">When I looked into<br>
doing a frontend warning for this, I seemed to struggle with figuring<br>
out specifically that I was in the catch handler of a<br>
function-try-block of a constructor or destructor.</blockquote><div><br></div><div>Looks like there's no better method than walking up the Scope stack until you hit a scope with the FnTryCatchScope flag (or leave the function), currently.</div></div></div></div>