This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]