[cfe-commits] [patch] Support decltype in pseudodestructor/dependent destructor calls

David Blaikie dblaikie at gmail.com
Mon Dec 12 12:25:25 PST 2011


On Mon, Dec 12, 2011 at 11:18 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
> On Sun, Dec 11, 2011 at 8:27 PM, David Blaikie <dblaikie at gmail.com> wrote:
>> Here's the finishing touches on decltype in explicit destructor calls
>> - supporting pseudodestructor calls and destructor calls on dependent
>> types (which are handled by Clang in a similar way to pseudodestructor
>> calls):
>>
>> typedef int foo;
>> foo f;
>> f.~decltype(foo())();
>>
>> template<typename T>
>> void func(T* t) {
>>  t->~decltype(T())();
>> }
>>
>> etc...
>
> Patch looks fine.

Thanks Eli - actually, as I was going to check this in & remembered
I'd wanted to refactor the arrow-testing logic I'd shamelessly
copy-pasted from one of the other pseudo-destructor parsing functions.
(it tests for arrow uses that should be '.') See
SemaExprCXX.cpp:4327-4345, repeated at 4445-4463, and then repeated
again in my patch.

I moved this logic into a common, static, utility function - but then
I got thinking. How/when does this actually occur? Since
pseudodestructors can destroy any object, it seems impossible for us
to ever correctly diagnose an erroneous '->' that should be a '.'
before we've seen the type on the right of the '~'. So I replaced the
diag+fixit with an assertion & ran the test suite. It never fires.

I tested the following for cases:

struct foo { void bar(); };
void func(foo* f, foo& g) {
  f.~foo();
  f->~foo();
  g.~foo();
  g->~foo();
}

and none of them produce the -> fixit:

arrow.cpp:3:6: error: the type of object expression ('foo *') does not
match the type being destroyed ('foo') in pseudo-destructor
      expression
  f.~foo();
  ~  ^~~
arrow.cpp:6:4: error: member reference type 'foo' is not a pointer
  g->~foo();
  ~^

It seems this code is dead, so far as I can tell. Should I delete the
existing two instances of it & remove the one I was going to add to my
code?

(if we wanted to do something fancy we could wait until after we've
parsed the rhs & if the mismatch between base left and right is only
by pointer then we could issue the fixit to switch -> to . or the
other way around, if we think that's the right thing to do (I think
it's hard to guess which one the user really intended - whether they
meant to destroy the pointer or pointee... so I'm not sure if we
should guess))

- David




More information about the cfe-commits mailing list