------- Comment #4 from mmitchel at gcc dot gnu dot org  2006-06-15 00:27 
-------
John Spicer and I discussed this issue, but I don't think we've got a clear
resolution.  John believes the example is valid.

However, I asked:

=====
 template <int> void g();

 template <typename T>
 struct S {
   static int i[];
   void f();
 };

 template <typename T>
 int S<T>::i[] = { 1 };

 template <typename T>
 void S<T>::f() {
   g<sizeof (i) / sizeof (int)>();
 }

 template <typename T>
 int S<int>::i[] = { 1, 2 };

Which g is called from S<int>::f()?

If the program is valid, then surely one would expect g<2> to be called.

If the program is valid, does S<T>::i have a non-dependent type in
S<T>::f?  If so, is it incomplete, or is it int[1]?  (Here, int[1] would
be surprising, since S<int>::i actually has type int[2].)

If the program is invalid, why?
=====

John says that this is core issue #408.  I'm not sure that's really the same
issue, but it's related.

The problem I see is that if S<T>::i has a non-dependent type, it must be
either int[1] or int[].  In the former case, the specialization is invalid.  In
the latter case, S<T>::f is invalid since it applies sizeof to an incomplete
type.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27347

Reply via email to