Gabriel Dos Reis <gdr@xxxxxxxxxxxxxxxxxxxxxxxx> wrote:
> 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)
>> 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.
Seconded. Even if it looks that, for this particular construct, we never got
the SFINAE case right, it always errors out (note: I don't know if it's
correct or not that SFINAE doesn't apply here). If that'd be case, this code
should bring no regressions for code which previously compiled correctly.
I'm also nervous because EDG rejects this construct.