g++ 2.95.2 bug

John H. Spicer jhs@edg.com
Fri Dec 31 20:54:00 GMT 1999

"Martin v. Loewis" wrote:
> > The deduction is done as if the function was being called.
> That does not work. First, talks about arguments, and there
> are no arguments. It may be possible to synthesize arguments, but that
> is not explained anywhere.
> More important, I believe this would break a number of cases that
> currently work (*). At the moment,
>    template<class T>void foo(X<T>&,T&){}
> is more specialized than
>   template<class T,class U>void foo(X<T>&,U&){}
> If I would use for partial ordering, that would not be the
> case anymore. To see that, I synthesize a type A1, giving me 'void
> foo(X<A1>&,A1&)', and performing deduction agains the second.
> Therefore, I have to compare X<T>& with X<A1>&, and U& with
> A1&. According to, I drop the references on the parameter
> types, having now to compare X<T> with X<A1>&, and U with A1&.
> U could be deduced as A1& (giving me references to references!?!).
> T cannot be deduced, so deduction fails.
> Please note that this is not an issue for a true function call, since
> references on expressions are dropped in 5p6.

Of course you have to drop the reference types on arguments for this
very reason.

> So I think the rules for function calls don't work for partial
> ordering. If you want removal of top-level references in partial
> ordering, you'll have to make new rules.

As I said before, this should be clarified.  

> > Also, note that the example following paragraph 5 illustrates that
> > "T" and "T&" are not partially ordered relative to one another,
> > which is the consequence of top-level references being removed.
> Since g++ does not remove top-level references, it consequently
> accepts this example completely, invoking "void g<float>(float &)".
> Should I raise another issue, or are the existing ones sufficient for
> some action by the committee?

I think an issue should be raised for this.


More information about the Gcc-bugs mailing list