[PATCH?] 'this' in typedefs, possibly overly complicated code in other 'this' checks?
Harald van Dijk
harald at gigawatt.nl
Wed Jan 15 22:38:43 PST 2014
Ah, thanks, you're right. If the in-class declaration doesn't use
'this', but the definition does, then 'this' would not be diagnosed with
my approach. Normally, if the definition does, so would the in-class
declaration, where it would be diagnosed, but an example of where it
doesn't is
struct Foo {
static bool f();
};
auto Foo::f() -> decltype(this != 0) {
return true;
}
Cheers,
Harald van Dijk
On 16/01/14 01:25, Richard Smith wrote:
> 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.
>
> On Wed Jan 15 2014 at 3:33:07 PM, Harald van Dijk <harald at gigawatt.nl
> <mailto:harald at gigawatt.nl>> wrote:
>
> Hi all,
>
> This came up on StackOverflow recently:
>
> 'this' is rejected by clang in static member functions:
>
> error: 'this' cannot be used in a static member function declaration
> static auto f() -> decltype(this);
> ^
>
> However, what the standard actually says is that 'this' is not allowed
> except in non-static member functions (and some more bits not relevant
> here). Declarations that look like member functions but aren't, not even
> static ones, shouldn't allow 'this' either.
>
> typedef auto f() -> decltype(this);
>
> Looking to see what clang implements, I was very surprised. There is
> already perfectly functional code that rejects 'this' in 'friend'
> functions, and that code is not reused for 'static' functions (and
> 'typedef's): instead, the checks have effectively been rewritten for
> 'static'.
>
> I'm wondering, why is that? If I do attempt to re-use the existing code,
> as in the attached patch, then the only changes in the test results are
> actually correct, as references to non-static data members are permitted
> even in 'static' functions, so long as they appear in unevaluated
> expressions. There is even a FIXME comment about this in the test. But
> I'm sure the current checks have been added for a good reason. Am I
> overlooking some important details that are not covered by the
> testsuite?
>
> Cheers,
> Harald van Dijk
> _________________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/__mailman/listinfo/cfe-commits
> <http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits>
>
More information about the cfe-commits
mailing list