This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/47950] New: [C++0x] Internal compiler error: non-dependent declaration as condition causes tsubst_copy_and_build assertion failure.
- From: "dev.lists at jessamine dot co.uk" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 2 Mar 2011 11:21:02 +0000
- Subject: [Bug c++/47950] New: [C++0x] Internal compiler error: non-dependent declaration as condition causes tsubst_copy_and_build assertion failure.
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47950
Summary: [C++0x] Internal compiler error: non-dependent
declaration as condition causes tsubst_copy_and_build
assertion failure.
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: dev.lists@jessamine.co.uk
The following program demonstrates an assertion failure in
tsubst_copy_and_build when compiling in C++0x mode.
It may be related to bug 47808 which fails the same assertion via a different
route (looks like it's using a non-dependent constexpr function to determine
the size of an array).
This issue demonstrated here appears to manifest only when a non-dependent
declaration is used as a condition within a selection statement inside a
template -- and only then if the standard initializer syntax is used with the
rhs being a constructor or function call.
This was done using 4.6.0 20110302 built this morning. Failures only occur in
C++0x mode.
This is a recent regression -- a build from a few days ago did not exhibit this
issue.
template <typename T> struct empty
{
// allow success case to build (not relevant to bug)
operator bool() { return true; }
};
template <typename T> struct from_int
{
from_int(int) {}
// allow success case to build (not relevant to bug)
operator bool() { return true; }
};
template <typename T>
from_int<T> via_function(T v)
{
return from_int<T>(v);
}
template <typename T>
void f()
{
// ********* this section compiles ***********
// these plain initializers work fine
from_int<int> a = 7;
from_int<int> b = from_int<int>(7);
empty<int> c = empty<int>();
from_int<T> ta = 7;
from_int<T> tb = from_int<T>(7);
empty<T> tc = empty<T>();
// these dependent condition decls work fine
if (empty<T> x = empty<T>())
;
if (from_int<T> x = 7)
;
if (from_int<T> x = from_int<T>(7))
;
if (from_int<T> x = via_function(T()))
;
// this non-dependent condition decl using conversion works fine
if (from_int<int> x = 7)
;
// these non-dependent condition decls using conversion or braced-
// initialization work fine (in c++0x mode only course)
#if __GXX_EXPERIMENTAL_CXX0X__
if (empty<int> x {})
;
if (from_int<int> x {7})
;
#endif
// ********** this section fails in C++0x ***********
// the following non-dependent condition decls cause an assertion
// failure in
//
// tsubst_copy_and_build, at cp/pt.c:13370
//
// in C++0x mode
//
if (empty<int> x = empty<int>())
;
if (from_int<int> x = from_int<int>(7))
;
if (from_int<int> x = via_function(7))
;
}
int main()
{
f<int>();
}