public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
From: smacdonald@seimac.com
To: gcc-gnats@gcc.gnu.org
Subject: c++/4377: more errors with multiple non-type template parameters
Date: Sat, 22 Sep 2001 11:56:00 -0000	[thread overview]
Message-ID: <20010922185421.1496.qmail@sourceware.cygnus.com> (raw)

>Number:         4377
>Category:       c++
>Synopsis:       more errors with multiple non-type template parameters
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          ice-on-legal-code
>Submitter-Id:   net
>Arrival-Date:   Sat Sep 22 11:56:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Scott MacDonald
>Release:        gcc-3.1 snapshot of 2001-09-17
>Organization:
>Environment:
Red Hat Linux 7.1, Intel
>Description:
This problem is an extension of bug #3911.  The code posted in that report compiles fine, but the addition of another operator causes an  Internal error: Segmentation fault .

The code works fine using gcc 2.95.3 and using Comeau Computing's online compiler (4.2.45.2).

This was the result of a compile of test-1.cc (code below).
> g++ test-1.cc
test-1.cc: In function `int main()':
test-1.cc:28: Internal error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL: http://www.gnu.org/software/gcc/bugs.html > for instructions.

For a bit more information if you add a specialization of the template with inline friends (not nice but legal and necessary on older gcc versions) the compile no longer gets an internal error, but complains about virtual functions being abstract. (code test-2.cc is below)

> g++ test-2.cc
test-2.cc:33: invalid return type for function `unit<0, 0> operator/(const
   unit<0, 0>&, const unit<0, 0>&)'
test-2.cc:33:   because the following virtual functions are abstract:
test-2.cc:30:   unit<0, 0> operator*(const unit<0, 0>&, const unit<0, 0>&)
test-2.cc:46: confused by earlier errors, bailing out

The above test also compiles find on both g++ 2.95.3 and Comeau Computing (4.2.45.2).

Scott MacDonald

code:
==========================================
test-1.cc

template < int I1, int I2 >
class unit
{
public:
  unit() {}
  unit( const unit<I1,I2>& ) {}

  template< int Q1, int Q2 >
  unit< I1 + Q1, I2 + Q2 > operator * ( const unit< Q1, Q2 >& rhs ) const {
    return unit< I1 + Q1, I2 + Q2 >();
  }
 
  template< int Q1, int Q2 >
  unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const {
    return unit< I1 - Q1, I2 - Q2 >();
  }
 
};
 
int main()
{
  const unit<1,0> u1;
  const unit<2,0> u2;
 
  unit<-1,0> u3( u1 / u2 );
  unit< 3,0> u4( u1 * u2 );
}

======================================
test-2.cc

template < int I1, int I2 >
class unit
{
public:
  typedef unit<I1,I2> my_type;

  unit() {}
  unit( const unit<I1,I2>& ) {}

   template< int Q1, int Q2 >
   unit< I1 + Q1, I2 + Q2 > operator * ( const unit< Q1, Q2 >& rhs ) const {
     return unit< I1 + Q1, I2 + Q2 >();
   }
 
  template< int Q1, int Q2 >
  unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const {
    return unit< I1 - Q1, I2 - Q2 >();
  }
};

// specialization added to first test
//
template <>
class unit<0,0> {
public:
  typedef unit<0,0> my_type;

  unit() {}
  
   friend unit<0,0> operator*( const unit<0,0>& lhs, const unit<0,0>& rhs ) {
     return unit<0,0>();
   }
   friend unit<0,0> operator/( const unit<0,0>& lhs, const unit<0,0>& rhs ) {
     return unit<0,0>();
   }

};


int main()
{
  const unit<1,0> u1;
  const unit<2,0> u2;
 
  unit<-1,0> u3( u1 / u2 );
  unit< 3,0> u4( u1 * u2 );
}

>How-To-Repeat:
g++ test-1.cc
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


             reply	other threads:[~2001-09-22 11:56 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-09-22 11:56 smacdonald [this message]
2002-02-26 14:24 nathan
2002-03-13  8:56 Scott MacDonald
2002-03-18  4:10 jason
2002-03-18  5:50 jason

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=20010922185421.1496.qmail@sourceware.cygnus.com \
    --to=smacdonald@seimac.com \
    --cc=gcc-gnats@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).