This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/29859] New: reference-compatible is defined too narrowly in [decl.int.ref]


This is really a problem that arises *because* g++ implements the standard.
I have tried to raise this as a DR, but to no avail.

Subject:        Defect Report: reference-compatible is defined too narrowly in
[decl.int.ref]
Date:   Mon, 07 Feb 2005 17:33:41 +0000
From:   Joern Rennecke <joern.rennecke@st.com>
To:     std-c++@ncar.ucar.edu


8.5.3 [decl.int.ref] Paragraph 4 defines reference-compatible so
narrowly that "const int * const" is not reference-compatible to
"int * const" .  As a result, for this program:

extern void abort (void);

int i0 = 999;
int *const p = &i0;

const int *const &
foo ()
{
 return p;
}

int
main ()
{
 int i = *foo ();

 if (i != i0)
   abort ();
 return 0;
}

only the last item of 8.5.3 Paragraph 5 that applies to the return
value of foo, and hence foo is translated as if it was written as:

const int *const &
foo ()
{
int const *const p0 = p;

return p0;
}

I.e. the reference is bound to a temporary that lives only lives till
foo exits (in accordance with 12.2 [class.temporary] Paragraph 5).
Thus, using the value of *foo () invokes undefined behaviour.

The programmer will more likely expect foo to behave like it was written:

const int *const &
foo ()
{
 const int *const *p0 = &p;

 return *p0;
}

This works because the last item of 8.5.3 paragraph 14 applies, i.e.
standard conversions apply.  We can't convert to the cv-unqualified version
of the destination type, but that is not necessary since we can convert to
the cv-qualified destination type according to 4.4 [conv.qual] paragraph 4.

I think similar language to 4.4 paragraph 4 should be added to the
definition of reference compatibility in 8.5.3.

This could possibly combined with array type declarators as alternatives to
'pointer to' to also address DR 450.


-- 
           Summary: reference-compatible is defined too narrowly in
                    [decl.int.ref]
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: amylaar at gcc dot gnu dot org
OtherBugsDependingO 29842
             nThis:


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]