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

Reply via email to