[Cxx-abi-dev] [cxx-abi-dev] Mangling 'this' in	trailing-return-type
    Mike Herrick 
    mjh at edg.com
       
    Tue Sep 20 12:35:16 UTC 2011
    
    
  
[Re-post due to issues during the CodeSourcery->Mentor migration.]
On Jul 4, 2011, at 10:32 AM, Jason Merrill wrote:
> On 07/01/2011 11:44 PM, Jason Merrill wrote:
>> Since DR 1207, we need to have a representation for uses of 'this' in a
>> trailing-return-type. Perhaps "fpT"?
> 
> So,
> 
> struct B
> {
>  template <class U> U f();
> };
> 
> struct A
> {
>  B b;
>  // implicitly rewritten to (*this).b.f<U>()
>  // _ZN1A1fIiEEDTcldtdtdefpT1b1fIT_EEEv
>  template <class U> auto f() -> decltype (b.f<U>());
>  // _ZN1A1gIiEEDTcldtptfpT1b1fIT_EEEv
>  template <class U> auto g() -> decltype (this->b.f<U>());
> };
> 
> int main()
> {
>  A a;
>  a.f<int>();
>  a.g<int>();
> }
[Apologies for not responding to this earlier.]
"fpT" seems fine for explicit use of "this" in a trailing-return-type.
We're wondering about the implicit case.  Generally, our mangling mantra for SFINAE has been to make the mangled name match the source as closely as possible, so we produce _ZN1A1fIiEEDTcldt1b1fIT_EEEv (which demangles as "decltype(((b.f<T1>)())) A::f<int>()") as a mangled name for the first case above.  [EDG happens to use "this->" internally rather than "(*this).".]
Irrespective of the choice of mangling for the implicit case, what are your thoughts on a case like this:
// file 1:
struct B {
 template <class U> U f();
};
struct A {
 B b;
 template <class U> auto f() -> decltype (b.f<U>()) { return 0; }
};
A a;
auto x = a.f<int>();
// file 2:
struct B {
 template <class U> U f();
};
struct A {
 B b;
 template <class U> auto f() -> decltype (this->b.f<U>());
};
extern A a;
int main() {
 a.f<int>();
}
We think the implicit and explicit cases should have different manglings even if, from a SFINAE standpoint, they're treated the same, and have a preference for the "mangled as written" implicit mangling.
Mike Herrick
Edison Design Group
    
    
More information about the cxx-abi-dev
mailing list