This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3
- From: "jnapoli at alum dot mit.edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 15 Jan 2013 16:52:42 +0000
- Subject: [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3
- Auto-submitted: auto-generated
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: unassigned@gcc.gnu.org
ReportedBy: jnapoli@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