------- Comment #1 from sebor at roguewave dot com  2006-05-10 01:07 -------
Here's a test case designed to exhaustively exercise all cases mentioned in
14.8.2, p2. Hope it helps.

$ cat ~/tmp/t.cpp && (c=1; while [ $c -lt 15 ]; do printf "%s: " "$c"; gcc
-DCASE=$c ~/tmp/t.cpp 2>/dev/null; if [ $? -eq 0 ]; then echo okay; else echo
ERROR; fi; c=`expr $c + 1`; done)
#if CASE == 1
  // attempting to create an array with an element type that is void
template <class, class U = void> struct A { typedef U X [1]; };
#elif CASE == 2
  // attempting to create an array with an element type that is function
template <class, class U = void ()> struct A { typedef U X [1]; };
#elif CASE == 3
  // attempting to create an array with an element type that is a reference
template <class, class U = T&> struct A { typedef U X [1]; };
#elif CASE == 4
  // attempting to create an array with size that is zero
template <class, int N = 0> struct A { typedef T X [N]; };
#elif CASE == 5
  // attempting to create an array with size that is negative
template <class, int N = -1> struct A { typedef T X [N]; };
#elif CASE == 6
  // attempting to use a type that is not a class type in a qualified name
template <class T> struct A { typedef typename T::X X; };
#elif CASE == 7
  // attempting to use a non-existent member type
template <class T, class U = T> struct A { typedef typename A<U>::X X; };
#elif CASE == 8
  // attempting to create a pointer to reference type
template <class T, class U = T&> struct A { typedef U* X; };
#elif CASE == 9
  // attempting to create a reference to reference type
template <class T, class U = T&> struct A { typedef U& X; };
#elif CASE == 10
  // attempting to create a reference to void type
template <class T, class U = void> struct A { typedef U& X; };
#elif CASE == 11
  // attempting to create a pointer to member of T when T is not class type
template <class T> struct A { typedef int T::*X; };
#elif CASE == 12
  // attempting to perform an invalid conversion
char ch; 
template <class T, T* = &ch> struct A { typedef T X; };
#elif CASE == 13
  // attempting to create a function type with a void parameter
template <class T, class U = void> struct A { typedef T X (U); };
#elif CASE == 14
  // attempting to create a cv-qualified function type
template <class T, class U = void ()> struct A { typedef U& X; };
#else
#  error CASE not #defined
#endif

template <class T> struct B { typedef T Y; };

template <class T>
A<T> foo (T);

template <class T>
B<T> foo (T) { return B<T>(); }

int main ()
{
    foo (0);
}

The output of running the script with gcc 4.1:

1: ERROR
2: ERROR
3: ERROR
4: ERROR
5: ERROR
6: ERROR
7: ERROR
8: ERROR
9: ERROR
10: ERROR
11: ERROR
12: okay
13: ERROR
14: ERROR


-- 


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

Reply via email to