gcc-patches@gcc.gnu.org
[Top] [All Lists]

Re: [PATCH] Fix PR c++/19989 (4.0/4.1 regression)

Subject: Re: [PATCH] Fix PR c++/19989 4.0/4.1 regression
From: Gabriel Dos Reis
Date: 03 Nov 2005 12:06:53 +0100
Josh Conner <jconner@xxxxxxxxx> writes:

| The attached patches fix PR c++/19989 on the 4.0 and 4.1 branches.
| Without this fix, code of this form is rejected:
| 
|   template<int> struct A
|   {
|     static const int i = 0;
|   };
| 
|   template<int N> struct B
|   {
|     int x[A<N>::i];
|   };
| 
|   B<0> b;
| 
| It was rejected because template instantiation was being conservative in
| not allowing zero-sized arrays, to avoid (correctly) something like this
| from also being accepted:
| 
|   template<int M> void foobar (int (*) [M] = 0 );
| 
|   void fn (void)
|   {
|     foobar<0>();
|   }
| 
| Fortunately, we can distinguish between these instances in this code by
| looking at the complain variable -- when we're committed to applying a
| template (as in the first case), tf_error will be set.

I'm nervous about this sort of extensions that change function
overload set -- especially for *conforming* programs, where such
constructs can happen in the preliminary stage of what is called
SFINAE.  I would like to see more testcases that cover corner cases.

-- Gaby

<Prev in Thread] Current Thread [Next in Thread>