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



             Bug #: 56039

           Summary: ICE in iterative_hash_template_arg, at cp/pt.c:1606

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: hst...@ca.ibm.com

              Host: powerpc64-suse-linux

            Target: powerpc64-suse-linux

             Build: powerpc64-suse-linux





I am working on a code base which implements type traits using SFINAE,

and when I try it with GCC, I get the reported ICE.



The code uses C++11 lambda expressions in a constant expression context for

the SFINAE. As far as I can tell, SFINAE should apply since the lambda occurs

lexically within the immediate context for the substitution.



I have extracted a functional portion of the code base into a standalone file

(see below).





### Self-contained source:$ cat lambdaSupportedTraits.cc

template <bool> struct BoolSink { typedef void type; };



template <typename T, typename U>

struct AddRvalueReferenceImpl { typedef T type; };



template <typename T>

struct AddRvalueReferenceImpl<T, typename BoolSink<false &&

      [] {

         extern T &&tref;

      }>::type> {

   typedef T &&type;

};



template <typename T>

struct AddRvalueReference : AddRvalueReferenceImpl<T, void> { };



namespace ImplHelpers {

   template <typename T>

   typename AddRvalueReference<T>::type create(void) { }

}



template <typename T, typename U, typename ...Args>

struct IsConstructibleImpl { enum { value = 0 }; };



template <typename T, typename ...Args>

struct IsConstructibleImpl<T, typename BoolSink<false &&

      [] {

         T t( ::ImplHelpers::create<Args>() ...);

      }>::type, Args ...> {

   enum { value = 1 };

};



template <typename T, typename ...Args>

struct IsConstructible : IsConstructibleImpl<T, void, Args ...> { };



struct DestroyMe {

   ~DestroyMe() = delete;

};



static_assert(+IsConstructible<int>::value, "error");

static_assert(!IsConstructible<void>::value, "error");

static_assert(+IsConstructible<int [1]>::value, "error");

static_assert(!IsConstructible<DestroyMe>::value, "error");

static_assert(!IsConstructible<int *, char *>::value, "error");



static_assert(+IsConstructible<int &&, int>::value, "error");

static_assert(!IsConstructible<int &&, int &>::value, "error");

static_assert(+IsConstructible<int &&, int &&>::value, "error");





### Compiler output:$ g++-4.7 -std=c++11 lambdaSupportedTraits.cc -c

lambdaSupportedTraits.cc:10:8: internal compiler error: in

iterative_hash_template_arg, at cp/pt.c:1606

Please submit a full bug report,

with preprocessed source if appropriate.

See <http://bugs.opensuse.org/> for instructions.





### g++ -v output:$ g++-4.7 -v

Using built-in specs.

COLLECT_GCC=/GCC_INSTALL/bin/g++-4.7

COLLECT_LTO_WRAPPER=/GCC_INSTALL/libexec/gcc/powerpc64-suse-linux/4.7.2/lto-wrapper

Target: powerpc64-suse-linux

Configured with: ../GCC_SOURCE/gcc-4.7.2/configure --prefix=/GCC_INSTALL

--enable-languages=c,c++,fortran --enable-checking=release --enable-ssp

--disable-libssp --with-bugurl=http://bugs.opensuse.org/

--with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap

--enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch

--enable-version-specific-runtime-libs --program-suffix=-4.7

--enable-linux-futex --without-system-libunwind --with-cpu=power4

--enable-secureplt --with-long-double-128 --build=powerpc64-suse-linux

--with-mpc=/GCC_INSTALL/mpc1.0.1 --with-mpfr=/GCC_INSTALL/mpfr3.1.1

--with-gmp=/GCC_INSTALL/gmp5.1

--with-zlib-include=/usr/src/linux-3.0.13-0.27/include/linux

--with-zlib-lib=/lib

Thread model: posix

gcc version 4.7.2 (SUSE Linux)

Reply via email to