http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
Bug #: 55993 Summary: tuple_cat not a constant expression for result size >= 3 Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: jnap...@alum.mit.edu Created attachment 29171 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29171 pre-processed test case I expect the following code to compile: #include <tuple> struct A {}; constexpr auto tuple = std::tuple_cat( std::make_tuple( A(), A() ), std::make_tuple( A() ) ); However, it fails with "... is not a constant expression". It looks like tuple_cat is not a constant expression when it returns a tuple of length three or more. Here's the full error output: $ g++ -v -Wall -Wextra -std=c++11 constexpr_tuple_cat.cpp Using built-in specs. COLLECT_GCC=C:\MinGW\bin\g++.exe COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1-with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.7.2 (GCC) COLLECT_GCC_OPTIONS='-v' '-Wall' '-Wextra' '-std=c++11' '-shared-libgcc' '-mtune=i386' '-march=i386' c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/cc1plus.exe -quiet -v -iprefix c:\mingw\bin\../lib/gcc/mingw32/4.7.2/ constexpr_tuple_cat.cpp -quiet -dumpbase constexpr_tuple_cat.cpp -mtune=i386 -march=i386 -auxbase constexpr_tuple_cat -Wall -Wextra -std=c++11 -version -o C:\Users\jnapoli\AppData\Local\Temp\cc2YWCJS.s GNU C++ (GCC) version 4.7.2 (mingw32) compiled by GNU C version 4.7.2, GMP version 5.0.1, MPFR version 2.4.1, MPC version 0.8.1 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring nonexistent directory "c:\mingw\bin\../lib/gcc/mingw32/4.7.2/../../../../mingw32/include" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.7.2/include/c++" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.7.2/include/c++/mingw32" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.7.2/include/c++/backward" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.7.2/include" ignoring duplicate directory "/mingw/lib/gcc/mingw32/4.7.2/../../../../include" ignoring duplicate directory "c:/mingw/lib/gcc/../../include" ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.7.2/include-fixed" ignoring nonexistent directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.7.2/../../../../mingw32/include" ignoring duplicate directory "/mingw/include" #include "..." search starts here: #include <...> search starts here: c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++ c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/mingw32 c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/backward c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include c:\mingw\bin\../lib/gcc/mingw32/4.7.2/../../../../include c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include-fixed End of search list. GNU C++ (GCC) version 4.7.2 (mingw32) compiled by GNU C version 4.7.2, GMP version 5.0.1, MPFR version 2.4.1, MPC version 0.8.1 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: fdc0bc7c97f61ac24bf8edb5646b3bc3 constexpr_tuple_cat.cpp:3:92: in constexpr expansion of 'std::tuple_cat(_Tpls&& ...) [with _Tpls = {std::tuple<A, A>, std::tuple<A>}; <template-parameter-1-2> = void; typename std::__tuple_cat_result<_Tpls ...>::__type = std::tuple<A, A, A>]((* & std::make_tuple(_Elements&& ...) [with _Elements = {A}; typename std::__decay_and_strip<_Elements>::__type = <type error>]()))' constexpr_tuple_cat.cpp:3:92: in constexpr expansion of 'std::__tuple_concater<_Ret, std::_Index_tuple<_Is ...>, _Tp, _Tpls ...>::_S_do(_Tp&&, _Tpls&& ..., _Us&& ...) [with _Us = {}; _Ret = std::tuple<A, A, A>; unsigned int ..._Is = {0u, 1u}; _Tp = std::tuple<A, A>; _Tpls = {std::tuple<A>}]((* & std::forward<std::tuple<A> >((* & __tpls#1))))' c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/tuple:1009:52: in constexpr expansion of 'std::get<0u, {A, A}>((* & std::forward<std::tuple<A, A> >((* & __tp))))' c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/tuple:759:45: in constexpr expansion of 'std::get<0u, {A, A}>((* & __t))' c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/tuple:744:35: in constexpr expansion of 'std::__get_helper<0u, A, {A}>((*(std::_Tuple_impl<0u, A, A>*)(& __t)))' c:\mingw\bin\../lib/gcc/mingw32/4.7.2/include/c++/tuple:729:60: in constexpr expansion of 'std::_Tuple_impl<_Idx, _Head, _Tail ...>::_M_head<0u, A, {A}>((* & __t))' constexpr_tuple_cat.cpp:3:92: error: '(std::_Head_base<0u, A, true>*)(& std::tuple<A, A>())' is not a constant expression