On 16/01/2014 06:38, Harald van Dijk wrote:
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.

Hi Harald,

If you have the time could you throw together a couple of tests for those cases as well?

checkThisInStaticMemberFunctionAttributes() looks like it can be dropped now that RecursiveASTVisitor visits attributes (r198224) so I'm hopeful we can still apply the bulk of the cleanup from your original patch without regressing.

Alp.



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 <[email protected]
<mailto:[email protected]>> 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
     [email protected] <mailto:[email protected]>
     http://lists.cs.uiuc.edu/__mailman/listinfo/cfe-commits
     <http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits>

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

--
http://www.nuanti.com
the browser experts

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to