public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "dev.lists at jessamine dot co.uk" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/47950] New: [C++0x] Internal compiler error: non-dependent declaration as condition causes tsubst_copy_and_build assertion failure.
Date: Wed, 02 Mar 2011 11:21:00 -0000	[thread overview]
Message-ID: <bug-47950-4@http.gcc.gnu.org/bugzilla/> (raw)

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>();
}


             reply	other threads:[~2011-03-02 11:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-02 11:21 dev.lists at jessamine dot co.uk [this message]
2011-03-02 15:39 ` [Bug c++/47950] " dev.lists at jessamine dot co.uk
2011-03-02 16:08 ` [Bug c++/47950] [4.6 Regression] " redi at gcc dot gnu.org
2011-03-02 16:30 ` dev.lists at jessamine dot co.uk
2011-03-02 22:46 ` jason at gcc dot gnu.org
2011-03-03  2:49 ` jason at gcc dot gnu.org
2011-03-03  8:47 ` dev.lists at jessamine dot co.uk
2011-03-03 16:51 ` jason at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-47950-4@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).