public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/31419]  New: template user defined conversion operator instantiated for conversion to self
@ 2007-04-01 13:26 james dot kanze at gmail dot com
  2007-04-01 14:39 ` [Bug c++/31419] " fang at csl dot cornell dot edu
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: james dot kanze at gmail dot com @ 2007-04-01 13:26 UTC (permalink / raw)
  To: gcc-bugs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1933 bytes --]

The following code does not compile:
------------------templcvt.cc----------------
extern int f( int ) ;

class B
{
public:
    template< typename T >
        operator T const& () const
    {
        return f( 42 ) ;
    }
} ;

B
g()
{
    return B() ;
}
---------------------------------------------
When invoking "g++ -c templcvt.cc", the compiler outputs the
following error messages:

    templcvt.cc: In member function 'B::operator const T&() const [with T =
B]':
    templcvt.cc:24:   instantiated from here
    templcvt.cc:17: error: invalid initialization of reference of type 'const
B&' from expression of type 'int'

Apparently, it is instantiating the template conversion operator
in order to bind the temporary object to the B const& argument
of the (implicit) copy constructor.  This dispite §12.3.2.1 "A
conversion function is never used to convert a (possibly
cv-qualified) object to the (possibly cv-qualified) same object
type (or a reference to it),[...]" (and the fact, of course,
that a function template should only be instantiated if the
function is used).

There's a simple work-around: just define an explicit:

    operator B const&() const { return *this ; }

as well.  But this shouldn't be necessary.

(See also the discussion in comp.std.c++:
http://groups.google.com/group/comp.std.c++/browse_frm/thread/32139b794c433839/#)


-- 
           Summary: template user defined conversion operator instantiated
                    for conversion to self
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: james dot kanze at gmail dot com
 GCC build triplet: x86_64-unknown-linux-gnu
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: x86_64-unknown-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
@ 2007-04-01 14:39 ` fang at csl dot cornell dot edu
  2007-04-01 14:42 ` james dot kanze at gmail dot com
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: fang at csl dot cornell dot edu @ 2007-04-01 14:39 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #1 from fang at csl dot cornell dot edu  2007-04-01 15:38 -------
Aside, it looks to me as if operator () returns a reference (const) to a
temporary, which is undefined, no?  


-- 

fang at csl dot cornell dot edu changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |fang at csl dot cornell dot
                   |                            |edu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
  2007-04-01 14:39 ` [Bug c++/31419] " fang at csl dot cornell dot edu
@ 2007-04-01 14:42 ` james dot kanze at gmail dot com
  2007-04-01 15:57 ` fang at csl dot cornell dot edu
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: james dot kanze at gmail dot com @ 2007-04-01 14:42 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #2 from james dot kanze at gmail dot com  2007-04-01 15:42 -------
Subject: Re:  template user defined conversion operator instantiated for
conversion to self

On 1 Apr 2007 14:38:52 -0000, fang at csl dot cornell dot edu
<gcc-bugzilla@gcc.gnu.org> wrote:

> ------- Comment #1 from fang at csl dot cornell dot edu  2007-04-01 15:38 -------
> Aside, it looks to me as if operator () returns a reference (const) to a
> temporary, which is undefined, no?

There is no operator() in the code.  And there is no undefined
behavior is the reference is not used.  But that's not the
point.  What the user defined conversion operator does is
irrelevant, since it should never even be instantiated.

(This is not the actual code in my application, of course.  I've
simplified it to the maximum.)


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
  2007-04-01 14:39 ` [Bug c++/31419] " fang at csl dot cornell dot edu
  2007-04-01 14:42 ` james dot kanze at gmail dot com
@ 2007-04-01 15:57 ` fang at csl dot cornell dot edu
  2007-04-09 14:35 ` [Bug c++/31419] [4.1/4.2/4.3 regression] " reichelt at gcc dot gnu dot org
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: fang at csl dot cornell dot edu @ 2007-04-01 15:57 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #3 from fang at csl dot cornell dot edu  2007-04-01 16:57 -------
Subject: Re:  template user defined conversion operator
 instantiated for conversion to self

> There is no operator() in the code.  And there is no undefined
> behavior is the reference is not used.  But that's not the
> point.  What the user defined conversion operator does is
> irrelevant, since it should never even be instantiated.
>
> (This is not the actual code in my application, of course.  I've
> simplified it to the maximum.)

Yep, I realize it's irrelevant, which is why I mentioned it as an 'aside'.
:)  Just brought it up in case the non-reduced version in your original
code does actually use it.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] [4.1/4.2/4.3 regression] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
                   ` (2 preceding siblings ...)
  2007-04-01 15:57 ` fang at csl dot cornell dot edu
@ 2007-04-09 14:35 ` reichelt at gcc dot gnu dot org
  2007-04-15 22:13 ` mmitchel at gcc dot gnu dot org
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: reichelt at gcc dot gnu dot org @ 2007-04-09 14:35 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #4 from reichelt at gcc dot gnu dot org  2007-04-09 15:35 -------
Confirmed.
The code fails to compile since GCC 3.3.


-- 

reichelt at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |reichelt at gcc dot gnu dot
                   |                            |org
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|0                           |1
           Keywords|                            |monitored, rejects-valid
      Known to fail|                            |3.3 3.3.6 3.4.6 4.0.4 4.1.3
                   |                            |4.2.0 4.3.0
      Known to work|                            |3.2.3
   Last reconfirmed|0000-00-00 00:00:00         |2007-04-09 15:35:38
               date|                            |
            Summary|template user defined       |[4.1/4.2/4.3 regression]
                   |conversion operator         |template user defined
                   |instantiated for conversion |conversion operator
                   |to self                     |instantiated for conversion
                   |                            |to self
   Target Milestone|---                         |4.1.3


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] [4.1/4.2/4.3 regression] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
                   ` (3 preceding siblings ...)
  2007-04-09 14:35 ` [Bug c++/31419] [4.1/4.2/4.3 regression] " reichelt at gcc dot gnu dot org
@ 2007-04-15 22:13 ` mmitchel at gcc dot gnu dot org
  2007-04-23 16:03 ` janis at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mmitchel at gcc dot gnu dot org @ 2007-04-15 22:13 UTC (permalink / raw)
  To: gcc-bugs



-- 

mmitchel at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P1


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] [4.1/4.2/4.3 regression] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
                   ` (4 preceding siblings ...)
  2007-04-15 22:13 ` mmitchel at gcc dot gnu dot org
@ 2007-04-23 16:03 ` janis at gcc dot gnu dot org
  2007-09-04 14:06 ` jason at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: janis at gcc dot gnu dot org @ 2007-04-23 16:03 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #5 from janis at gcc dot gnu dot org  2007-04-23 17:02 -------
A regression hunt on powerc-linux using the submitter's testcase identified the
following patch:

    http://gcc.gnu.org/viewcvs?view=rev&rev=64815

    r64815 | nathan | 2003-03-24 19:47:17 +0000 (Mon, 24 Mar 2003)


-- 

janis at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nathan at gcc dot gnu dot
                   |                            |org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] [4.1/4.2/4.3 regression] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
                   ` (5 preceding siblings ...)
  2007-04-23 16:03 ` janis at gcc dot gnu dot org
@ 2007-09-04 14:06 ` jason at gcc dot gnu dot org
  2007-09-04 20:18 ` jason at gcc dot gnu dot org
  2007-09-13 16:05 ` jason at gcc dot gnu dot org
  8 siblings, 0 replies; 10+ messages in thread
From: jason at gcc dot gnu dot org @ 2007-09-04 14:06 UTC (permalink / raw)
  To: gcc-bugs



-- 

jason at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |jason at gcc dot gnu dot org
                   |dot org                     |
             Status|NEW                         |ASSIGNED
   Last reconfirmed|2007-04-09 15:35:38         |2007-09-04 14:06:33
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] [4.1/4.2/4.3 regression] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
                   ` (6 preceding siblings ...)
  2007-09-04 14:06 ` jason at gcc dot gnu dot org
@ 2007-09-04 20:18 ` jason at gcc dot gnu dot org
  2007-09-13 16:05 ` jason at gcc dot gnu dot org
  8 siblings, 0 replies; 10+ messages in thread
From: jason at gcc dot gnu dot org @ 2007-09-04 20:18 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #6 from jason at gcc dot gnu dot org  2007-09-04 20:18 -------
Subject: Bug 31419

Author: jason
Date: Tue Sep  4 20:18:05 2007
New Revision: 128102

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=128102
Log:
        PR c++/31419
        * call.c (reference_binding): Don't look for user-defined conversions
        to the same type.

Added:
    trunk/gcc/testsuite/g++.dg/conversion/self1.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/call.c


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug c++/31419] [4.1/4.2/4.3 regression] template user defined conversion operator instantiated for conversion to self
  2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
                   ` (7 preceding siblings ...)
  2007-09-04 20:18 ` jason at gcc dot gnu dot org
@ 2007-09-13 16:05 ` jason at gcc dot gnu dot org
  8 siblings, 0 replies; 10+ messages in thread
From: jason at gcc dot gnu dot org @ 2007-09-13 16:05 UTC (permalink / raw)
  To: gcc-bugs



------- Comment #7 from jason at gcc dot gnu dot org  2007-09-13 16:05 -------
Fixed for 4.2.2 and 4.3.0.


-- 

jason at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
      Known to fail|3.3 3.3.6 3.4.6 4.0.4 4.1.3 |3.3 3.3.6 3.4.6 4.0.4 4.1.3
                   |4.2.0 4.3.0                 |4.2.0
      Known to work|3.2.3                       |3.2.3 4.2.2 4.3.0
         Resolution|                            |FIXED


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31419


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-09-13 16:05 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-04-01 13:26 [Bug c++/31419] New: template user defined conversion operator instantiated for conversion to self james dot kanze at gmail dot com
2007-04-01 14:39 ` [Bug c++/31419] " fang at csl dot cornell dot edu
2007-04-01 14:42 ` james dot kanze at gmail dot com
2007-04-01 15:57 ` fang at csl dot cornell dot edu
2007-04-09 14:35 ` [Bug c++/31419] [4.1/4.2/4.3 regression] " reichelt at gcc dot gnu dot org
2007-04-15 22:13 ` mmitchel at gcc dot gnu dot org
2007-04-23 16:03 ` janis at gcc dot gnu dot org
2007-09-04 14:06 ` jason at gcc dot gnu dot org
2007-09-04 20:18 ` jason at gcc dot gnu dot org
2007-09-13 16:05 ` jason at gcc dot gnu dot org

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).