[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