Here is a testcase that results in an ICE:

#include <iostream>

typedef char present_t;
typedef struct { char a[2]; } absent_t;

template <typename T> T& MakeT();

template <typename T>
struct test
{
//   template <typename U, int (U::*f)(int n) = &U::operator[]>
//   struct helper{};

  template <typename U, int N = sizeof (MakeT<U>().operator[](0))>
  struct helper{};

  template <typename U>
  static absent_t is_here(...);

  template <typename U>
  static present_t is_here(helper<U>*);

  enum { ret = (sizeof(is_here<T>(0)) == sizeof(present_t)) };
};

struct A { };
struct B { int operator[](int n) { return n; } };

struct X : public A { };
struct Y : public B { };

int main()
{
  std::cout << "A has [] : " << test<A>::ret << std::endl;
  std::cout << "B has [] : " << test<B>::ret << std::endl;

  std::cout << "X:A has [] : " << test<X>::ret << std::endl;
  std::cout << "Y:B has [] : " << test<Y>::ret << std::endl;
}

The commented out block is the version of helper that doesn't cause the ICE,
while the second does.  This is broken on 3.4.4, 4.0.2, 4.1.0.  Works with
3.3.6.


-- 
           Summary: ICE with template processing
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: halcy0n at gentoo dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


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

Reply via email to