[cxx-abi-dev] Mangling late-specified return types/decltype

Jason Merrill jason at redhat.com
Fri Sep 26 22:05:45 UTC 2008


Jason Merrill wrote:
> More generally, within decltype/sizeof/alignof we aren't interested in 
> the value of a type, only the type itself, so there's a lot of 
> information in the expression which is irrelevant.  Within decltype, 
> *(T*)0 and t are equivalent: both are T lvalues. T(42) and T() and 
> T(a,b,0932) are also equivalent: all are T rvalues.
> 
> In all these cases, it seems like we could replace these expressions 
> with "lvalue placeholder" (sT) or "rvalue placeholder", and simplify 
> decltype (T lvalue placeholder) to T so we don't have to mangle as much 
> random expression gunk.
> 
> Otherwise we still need to establish a mangling for T(more,than,one,arg).

Now that the C++ meeting is over, did people have reactions to this?  We 
would probably want to define exactly what expression forms get reduced 
like this to avoid incompatibilities.

Simplifications within sizeof/alignof/decltype:

lvalue forms:

var
exp.member (where type of exp is not dependent)
exp->member (ditto *exp and exp doesn't overload op->)
*exp (where type of exp is known to be pointer to something)

rvalue forms:

T(args)
literals
rvalue.member

Should decltype(non-type-dependent expr) just get resolved to its type? 
  Do we want to handle anything else specially?  And/or leave member 
access out and mangle them using the normal rules?

Jason




More information about the cxx-abi-dev mailing list