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

Gabriel Dos Reis gdr@integrable-solutions.net
Thu Nov 3 11:07:00 GMT 2005


Josh Conner <jconner@apple.com> 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



More information about the Gcc-patches mailing list