How does this deal with the case where 'this' appears in a declarator for an out-of-line definition of a static member function? In that case, we don't know we're parsing a static member function declaration until *after* we've already parsed the 'this' expression. I believe the existing complexity was aimed at correctly handling that case; it seems surprising that we don't have any tests for it.<br>
<br><div>On Wed Jan 15 2014 at 3:33:07 PM, Harald van Dijk <<a href="mailto:harald@gigawatt.nl">harald@gigawatt.nl</a>> wrote:</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all,<br>
<br>
This came up on StackOverflow recently:<br>
<br>
'this' is rejected by clang in static member functions:<br>
<br>
error: 'this' cannot be used in a static member function declaration<br>
static auto f() -> decltype(this);<br>
^<br>
<br>
However, what the standard actually says is that 'this' is not allowed<br>
except in non-static member functions (and some more bits not relevant<br>
here). Declarations that look like member functions but aren't, not even<br>
static ones, shouldn't allow 'this' either.<br>
<br>
typedef auto f() -> decltype(this);<br>
<br>
Looking to see what clang implements, I was very surprised. There is<br>
already perfectly functional code that rejects 'this' in 'friend'<br>
functions, and that code is not reused for 'static' functions (and<br>
'typedef's): instead, the checks have effectively been rewritten for<br>
'static'.<br>
<br>
I'm wondering, why is that? If I do attempt to re-use the existing code,<br>
as in the attached patch, then the only changes in the test results are<br>
actually correct, as references to non-static data members are permitted<br>
even in 'static' functions, so long as they appear in unevaluated<br>
expressions. There is even a FIXME comment about this in the test. But<br>
I'm sure the current checks have been added for a good reason. Am I<br>
overlooking some important details that are not covered by the testsuite?<br>
<br>
Cheers,<br>
Harald van Dijk<br>
______________________________<u></u>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/cfe-commits</a><br>
</blockquote>