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 <[EMAIL PROTECTED]>
To:     [EMAIL PROTECTED]


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

Reply via email to