* [Bug libstdc++/55993] tuple_cat not a constant expression for result size >= 3
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
@ 2013-01-15 17:26 ` redi at gcc dot gnu.org
2013-01-15 17:29 ` redi at gcc dot gnu.org
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: redi at gcc dot gnu.org @ 2013-01-15 17:26 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2013-01-15
Ever Confirmed|0 |1
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> 2013-01-15 17:26:15 UTC ---
The problem is with 'get' not 'tuple_cat', the bug reduces to:
#include <tuple>
struct A {};
constexpr auto t = std::get<0>( std::make_tuple( A(), A() ) );
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/55993] tuple_cat not a constant expression for result size >= 3
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
2013-01-15 17:26 ` [Bug libstdc++/55993] " redi at gcc dot gnu.org
@ 2013-01-15 17:29 ` redi at gcc dot gnu.org
2013-01-15 18:44 ` jnapoli at alum dot mit.edu
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: redi at gcc dot gnu.org @ 2013-01-15 17:29 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2013-01-15 17:28:42 UTC ---
#include <tuple>
struct A {};
constexpr auto t = std::make_tuple( A(), A() );
constexpr auto a = std::get<0>( t );
t.cc:4:35: error: accessing value of 't' through a 'const A' glvalue in a
constant expression
constexpr auto a = std::get<0>( t );
^
Huh?
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug libstdc++/55993] tuple_cat not a constant expression for result size >= 3
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
2013-01-15 17:26 ` [Bug libstdc++/55993] " redi at gcc dot gnu.org
2013-01-15 17:29 ` redi at gcc dot gnu.org
@ 2013-01-15 18:44 ` jnapoli at alum dot mit.edu
2013-01-15 19:15 ` [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression redi at gcc dot gnu.org
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: jnapoli at alum dot mit.edu @ 2013-01-15 18:44 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #3 from Joshua Napoli <jnapoli at alum dot mit.edu> 2013-01-15 18:44:10 UTC ---
The problem has to do with a completely empty struct being used twice
consecutively in the tuple type list. std::tuple<A,A> inherits from A (by
inheriting _Head_base<A> which inherits A). Maybe there is a problem with
confusing the inherited types when struct A is empty and the base A might not
have a separate address from the top-level tuple.
It compiles OK when I add a member variable:
struct A { constexpr A() : x(0) {} int x; };
constexpr std::tuple<A,A> t;
constexpr auto a = decltype(t)::_M_head(t);
But fails without it:
struct A { constexpr A() /*: x(0)*/ {} /*int x;*/ };
constexpr std::tuple<A,A> t;
constexpr auto a = decltype(t)::_M_head(t);
It compiles OK when I use two different classes
struct A { constexpr A() {} };
struct B { constexpr B() {} };
constexpr std::tuple<A,B> t;
constexpr auto a = decltype(t)::_M_head(t);
If fails to build with two As and a B:
struct A { constexpr A() {} };
struct B { constexpr B() {} };
constexpr std::tuple<A,A,B> t;
constexpr auto a = decltype(t)::_M_head(t);
(Note that std::get<0>( std::tuple<...> ) returns std::tuple<...>::_M_head(t).)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (2 preceding siblings ...)
2013-01-15 18:44 ` jnapoli at alum dot mit.edu
@ 2013-01-15 19:15 ` redi at gcc dot gnu.org
2013-01-15 19:24 ` redi at gcc dot gnu.org
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: redi at gcc dot gnu.org @ 2013-01-15 19:15 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |rejects-valid
Component|libstdc++ |c++
Summary|tuple_cat not a constant |[C++11] derived-to-base
|expression for result size |conversion fails in
|>= 3 |constant expression
Known to fail| |4.6.3, 4.7.3, 4.8.0
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> 2013-01-15 19:15:36 UTC ---
This seems to be a C++ front end bug, here's the code reduced to remove library
dependencies:
template<int N, typename T>
struct Head : T
{ };
template<int N, typename... T>
struct Tuple;
template<int N>
struct Tuple<N>
{ };
template<int N, typename T, typename... U>
struct Tuple<N, T, U...> : Tuple<N+1, U...>, Head<N, T>
{ };
template<typename T, typename U>
struct tuple : Tuple<0, T, U>
{ };
struct A { };
constexpr tuple<A, A> t{};
constexpr auto a = static_cast<const Head<0, A>&>(t);
tt.cc:22:52: error: accessing value of 't' through a 'const Head<0, A>' glvalue
in a constant expression
constexpr auto a = static_cast<const Head<0, A>&>(t);
^
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (3 preceding siblings ...)
2013-01-15 19:15 ` [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression redi at gcc dot gnu.org
@ 2013-01-15 19:24 ` redi at gcc dot gnu.org
2013-01-15 19:27 ` jnapoli at alum dot mit.edu
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: redi at gcc dot gnu.org @ 2013-01-15 19:24 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jason at gcc dot gnu.org
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> 2013-01-15 19:24:03 UTC ---
Further reduced:
struct A { };
template<int N>
struct Head : A
{ };
struct Tuple : Head<0>, Head<1>
{ };
constexpr Tuple t{};
constexpr auto a = static_cast<const Head<1>&>(t);
tt.cc:11:49: error: accessing value of 't' through a 'const Head<1>' glvalue in
a constant expression
This only fails if the target of the cast is not the first base class (i.e.
accessing Head<1>) and if Head<N> derives from A, i.e. Tuple has two base
classes of type A
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (4 preceding siblings ...)
2013-01-15 19:24 ` redi at gcc dot gnu.org
@ 2013-01-15 19:27 ` jnapoli at alum dot mit.edu
2013-01-15 19:34 ` glisse at gcc dot gnu.org
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: jnapoli at alum dot mit.edu @ 2013-01-15 19:27 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #6 from Joshua Napoli <jnapoli at alum dot mit.edu> 2013-01-15 19:26:49 UTC ---
Awesome reduction of the bug!
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (5 preceding siblings ...)
2013-01-15 19:27 ` jnapoli at alum dot mit.edu
@ 2013-01-15 19:34 ` glisse at gcc dot gnu.org
2013-01-15 19:39 ` glisse at gcc dot gnu.org
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: glisse at gcc dot gnu.org @ 2013-01-15 19:34 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #7 from Marc Glisse <glisse at gcc dot gnu.org> 2013-01-15 19:34:17 UTC ---
struct A {};
struct B:A {};
struct C:A {};
struct D:B,C {};
constexpr D d;
constexpr const C& e=d; // OK
constexpr auto f=static_cast<const C&>(d); // FAIL
constexpr auto g=static_cast<const B&>(d); // FAIL different
Interesting mix of error messages:
e.cc:8:41: error: accessing value of 'd' through a 'const C' glvalue in a
constant expression
constexpr auto f=static_cast<const C&>(d); // FAIL
^
e.cc:9:41: error: the value of 'd' is not usable in a constant expression
constexpr auto g=static_cast<const B&>(d); // FAIL different
^
e.cc:6:13: note: 'd' used in its own initializer
constexpr D d;
^
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (6 preceding siblings ...)
2013-01-15 19:34 ` glisse at gcc dot gnu.org
@ 2013-01-15 19:39 ` glisse at gcc dot gnu.org
2013-02-13 17:57 ` jason at gcc dot gnu.org
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: glisse at gcc dot gnu.org @ 2013-01-15 19:39 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #8 from Marc Glisse <glisse at gcc dot gnu.org> 2013-01-15 19:38:46 UTC ---
(In reply to comment #7)
> e.cc:9:41: error: the value of 'd' is not usable in a constant expression
> constexpr auto g=static_cast<const B&>(d); // FAIL different
> ^
> e.cc:6:13: note: 'd' used in its own initializer
> constexpr D d;
> ^
Those are just because of the missing {} after the declaration of d, the
messages are not optimal, but forget my last comment.
It's just that the error is not exactly in the derived to base conversion but
trying to use that value afterwards.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (7 preceding siblings ...)
2013-01-15 19:39 ` glisse at gcc dot gnu.org
@ 2013-02-13 17:57 ` jason at gcc dot gnu.org
2013-02-15 19:28 ` jason at gcc dot gnu.org
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: jason at gcc dot gnu.org @ 2013-02-13 17:57 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #9 from Jason Merrill <jason at gcc dot gnu.org> 2013-02-13 17:56:33 UTC ---
Author: jason
Date: Wed Feb 13 17:56:28 2013
New Revision: 196023
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=196023
Log:
PR c++/55993
* semantics.c (cxx_fold_indirect_ref): Handle empty bases at
non-zero offsets, too.
Added:
trunk/gcc/testsuite/g++.dg/cpp0x/constexpr-empty6.C
Modified:
trunk/gcc/cp/ChangeLog
trunk/gcc/cp/semantics.c
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (8 preceding siblings ...)
2013-02-13 17:57 ` jason at gcc dot gnu.org
@ 2013-02-15 19:28 ` jason at gcc dot gnu.org
2015-02-26 15:49 ` splinterofchaos at gmail dot com
2015-02-26 17:12 ` jason at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: jason at gcc dot gnu.org @ 2013-02-15 19:28 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
Jason Merrill <jason at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |FIXED
AssignedTo|unassigned at gcc dot |jason at gcc dot gnu.org
|gnu.org |
Target Milestone|--- |4.8.0
--- Comment #10 from Jason Merrill <jason at gcc dot gnu.org> 2013-02-15 19:28:07 UTC ---
Fixed in 4.8 for now.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (9 preceding siblings ...)
2013-02-15 19:28 ` jason at gcc dot gnu.org
@ 2015-02-26 15:49 ` splinterofchaos at gmail dot com
2015-02-26 17:12 ` jason at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: splinterofchaos at gmail dot com @ 2015-02-26 15:49 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
splinterofchaos at gmail dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |splinterofchaos at gmail dot com
--- Comment #11 from splinterofchaos at gmail dot com ---
I still get an error with 4.9 when using one of the less reduced cases,
although not when using the test cases in that patch.
#include <tuple>
struct A {};
constexpr auto t = std::get<0>( std::make_tuple( A(), A() ) );
$ g++ test.cpp -std=c++14 -Wall -Wextra; and ./a.out; echo $status
test.cpp:3:61: in constexpr expansion of ‘std::get<0ul, {A, A}>((* &
std::make_tuple(_Elements&& ...) [with _Elements = {A, A}]((* & A()))))’
/usr/include/c++/4.9/tuple:774:44: in constexpr expansion of ‘std::get<0ul,
{A, A}>((* & __t))’
/usr/include/c++/4.9/tuple:757:40: in constexpr expansion of
‘std::__get_helper<0ul, A, {A}>((*(std::_Tuple_impl<0ul, A, A>*)(& __t)))’
/usr/include/c++/4.9/tuple:744:60: in constexpr expansion of
‘std::_Tuple_impl<_Idx, _Head, _Tail ...>::_M_head<0ul, A, {A}>((* & __t))’
test.cpp:3:61: error: ‘(std::_Head_base<0ul, A, true>*)(& std::tuple<A, A>())’
is not a constant expression
constexpr auto t = std::get<0>( std::make_tuple( A(), A() ) );
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.9.1-16ubuntu6'
--with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.9 --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls
--with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify
--enable-plugin --with-system-zlib --disable-browser-plugin
--enable-java-awt=gtk --enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64
--with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686
--with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib
--with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.1 (Ubuntu 4.9.1-16ubuntu6)
>From gcc-bugs-return-478603-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org Thu Feb 26 14:55:55 2015
Return-Path: <gcc-bugs-return-478603-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org>
Delivered-To: listarch-gcc-bugs@gcc.gnu.org
Received: (qmail 107945 invoked by alias); 26 Feb 2015 14:55:55 -0000
Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm
Precedence: bulk
List-Id: <gcc-bugs.gcc.gnu.org>
List-Archive: <http://gcc.gnu.org/ml/gcc-bugs/>
List-Post: <mailto:gcc-bugs@gcc.gnu.org>
List-Help: <mailto:gcc-bugs-help@gcc.gnu.org>
Sender: gcc-bugs-owner@gcc.gnu.org
Delivered-To: mailing list gcc-bugs@gcc.gnu.org
Received: (qmail 107905 invoked by uid 48); 26 Feb 2015 14:55:51 -0000
From: "dcb314 at hotmail dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/64570] error: non-trivial conversion at assignment
Date: Thu, 26 Feb 2015 15:54:00 -0000
X-Bugzilla-Reason: CC
X-Bugzilla-Type: changed
X-Bugzilla-Watch-Reason: None
X-Bugzilla-Product: gcc
X-Bugzilla-Component: c++
X-Bugzilla-Version: 5.0
X-Bugzilla-Keywords: ice-on-valid-code
X-Bugzilla-Severity: normal
X-Bugzilla-Who: dcb314 at hotmail dot com
X-Bugzilla-Status: NEW
X-Bugzilla-Priority: P3
X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org
X-Bugzilla-Target-Milestone: ---
X-Bugzilla-Flags:
X-Bugzilla-Changed-Fields:
Message-ID: <bug-64570-4-CUzGCB17rs@http.gcc.gnu.org/bugzilla/>
In-Reply-To: <bug-64570-4@http.gcc.gnu.org/bugzilla/>
References: <bug-64570-4@http.gcc.gnu.org/bugzilla/>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/
Auto-Submitted: auto-generated
MIME-Version: 1.0
X-SW-Source: 2015-02/txt/msg02935.txt.bz2
Content-length: 323
https://gcc.gnu.org/bugzilla/show_bug.cgi?idd570
--- Comment #3 from David Binderman <dcb314 at hotmail dot com> ---
(In reply to Richard Biener from comment #2)
> Fails everywhere, 4.6 rejects the testcase. Looks more like a C++ frontend
> issue to me.
Still goes wrong over a month later with trunk dated 20150225.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug c++/55993] [C++11] derived-to-base conversion fails in constant expression
2013-01-15 16:53 [Bug libstdc++/55993] New: tuple_cat not a constant expression for result size >= 3 jnapoli at alum dot mit.edu
` (10 preceding siblings ...)
2015-02-26 15:49 ` splinterofchaos at gmail dot com
@ 2015-02-26 17:12 ` jason at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: jason at gcc dot gnu.org @ 2015-02-26 17:12 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55993
--- Comment #12 from Jason Merrill <jason at gcc dot gnu.org> ---
(In reply to splinterofchaos from comment #11)
> I still get an error with 4.9 when using one of the less reduced cases,
> although not when using the test cases in that patch.
>
>
> #include <tuple>
> struct A {};
> constexpr auto t = std::get<0>( std::make_tuple( A(), A() ) );
This seems to be fixed on the trunk (GCC 5).
^ permalink raw reply [flat|nested] 13+ messages in thread