|
Boost : |
Subject: Re: [boost] [config] gcc implemented N3276 decltype
From: Michel Morin (mimomorin_at_[hidden])
Date: 2013-03-28 23:29:42
I reported to the PR ( http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52748 )
that the implementation of N3276 decltype was not complete,
since the compilation of the following code exhausted all resources:
template<class T> struct S;
template<class X, class Y> struct pair {};
template<class T> S<T> wrap(T) { return 0; }
template<class T>
struct S
{
S(int = 0) {}
decltype(wrap(pair<T,T>())) foo() { return 0; } // ERROR
S<pair<T,T> > bar() { return 0; } // OK
};
S<int> s;
Jason Merrill responded that gcc's implementation was complete and the
failure was due to the conflict with the fix for DR 337 and 657.
**It seems that the Core Issue will be raised**:
Jason Merrill:
> The implementation is complete. Unfortunately, my fixes for DRs 337 and
657
> are interfering with the desired result; creating a function type
returning an
> abstract class causes deduction to fail, so we instantiate the return
type of
> wrap in order to determine whether it is abstract. I guess I'll disable
that
> instantiation and raise this issue with Core...
And the fix has been committed:
Jason Merrill:
> The change to force instantiation to check for abstract return types
> broke this change; until the core SG has a chance to discuss the
> language inconsistency, I'm going to disable that instantiation in
> decltype context.
>
> Tested x86_64-pc-linux-gnu, applying to trunk.
I confirmed the fix and the test ran fine.
So I committed a Boost.Config fix in r83625:
https://svn.boost.org/trac/boost/changeset/83625
Regards,
Michel
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk