Message ID | YS3uHo2VYmn5JqjX@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: Fix docs on assignment of virtual bases [PR60318] | expand |
Ping (and remember to CC a maintainer this time). On 31/08/21 09:53 +0100, Jonathan Wakely wrote: >The description of behaviour is incorrect, the virtual base gets >assigned before entering the bodies of A::operator= and B::operator=, >not after. > >The example is also ill-formed (passing a string literal to char*) and >undefined (missing return from Base::operator=). > >Signed-off-by: Jonathan Wakely <jwakely@redhat.com> > >gcc/ChangeLog: > > PR c++/60318 > * doc/trouble.texi (Copy Assignment): Fix description of > behaviour and fix code in example. > >OK for trunk and all active branches? > >commit f0fa91971e35c1df7381ac289ece9bd5f07f8535 >Author: Jonathan Wakely <jwakely@redhat.com> >Date: Tue Aug 31 09:46:41 2021 > > c++: Fix docs on assignment of virtual bases [PR60318] > > The description of behaviour is incorrect, the virtual base gets > assigned before entering the bodies of A::operator= and B::operator=, > not after. > > The example is also ill-formed (passing a string literal to char*) and > undefined (missing return from Base::operator=). > > Signed-off-by: Jonathan Wakely <jwakely@redhat.com> > > gcc/ChangeLog: > > PR c++/60318 > * doc/trouble.texi (Copy Assignment): Fix description of > behaviour and fix code in example. > >diff --git a/gcc/doc/trouble.texi b/gcc/doc/trouble.texi >index 40c51ae21cb..8b34be4aa63 100644 >--- a/gcc/doc/trouble.texi >+++ b/gcc/doc/trouble.texi >@@ -865,10 +865,11 @@ objects behave unspecified when being assigned. For example: > @smallexample > struct Base@{ > char *name; >- Base(char *n) : name(strdup(n))@{@} >+ Base(const char *n) : name(strdup(n))@{@} > Base& operator= (const Base& other)@{ > free (name); > name = strdup (other.name); >+ return *this; > @} > @}; > >@@ -901,8 +902,8 @@ inside @samp{func} in the example). > G++ implements the ``intuitive'' algorithm for copy-assignment: assign all > direct bases, then assign all members. In that algorithm, the virtual > base subobject can be encountered more than once. In the example, copying >-proceeds in the following order: @samp{val}, @samp{name} (via >-@code{strdup}), @samp{bval}, and @samp{name} again. >+proceeds in the following order: @samp{name} (via @code{strdup}), >+@samp{val}, @samp{name} again, and @samp{bval}. > > If application code relies on copy-assignment, a user-defined > copy-assignment operator removes any uncertainties. With such an
On 9/8/21 3:52 PM, Jonathan Wakely via Gcc-patches wrote: > Ping (and remember to CC a maintainer this time). OK, thanks. > > On 31/08/21 09:53 +0100, Jonathan Wakely wrote: >> The description of behaviour is incorrect, the virtual base gets >> assigned before entering the bodies of A::operator= and B::operator=, >> not after. >> >> The example is also ill-formed (passing a string literal to char*) and >> undefined (missing return from Base::operator=). >> >> Signed-off-by: Jonathan Wakely <jwakely@redhat.com> >> >> gcc/ChangeLog: >> >> PR c++/60318 >> * doc/trouble.texi (Copy Assignment): Fix description of >> behaviour and fix code in example. >> >> OK for trunk and all active branches? >> > >> commit f0fa91971e35c1df7381ac289ece9bd5f07f8535 >> Author: Jonathan Wakely <jwakely@redhat.com> >> Date: Tue Aug 31 09:46:41 2021 >> >> c++: Fix docs on assignment of virtual bases [PR60318] >> >> The description of behaviour is incorrect, the virtual base gets >> assigned before entering the bodies of A::operator= and B::operator=, >> not after. >> >> The example is also ill-formed (passing a string literal to char*) and >> undefined (missing return from Base::operator=). >> >> Signed-off-by: Jonathan Wakely <jwakely@redhat.com> >> >> gcc/ChangeLog: >> >> PR c++/60318 >> * doc/trouble.texi (Copy Assignment): Fix description of >> behaviour and fix code in example. >> >> diff --git a/gcc/doc/trouble.texi b/gcc/doc/trouble.texi >> index 40c51ae21cb..8b34be4aa63 100644 >> --- a/gcc/doc/trouble.texi >> +++ b/gcc/doc/trouble.texi >> @@ -865,10 +865,11 @@ objects behave unspecified when being assigned. >> For example: >> @smallexample >> struct Base@{ >> char *name; >> - Base(char *n) : name(strdup(n))@{@} >> + Base(const char *n) : name(strdup(n))@{@} >> Base& operator= (const Base& other)@{ >> free (name); >> name = strdup (other.name); >> + return *this; >> @} >> @}; >> >> @@ -901,8 +902,8 @@ inside @samp{func} in the example). >> G++ implements the ``intuitive'' algorithm for copy-assignment: assign >> all >> direct bases, then assign all members. In that algorithm, the virtual >> base subobject can be encountered more than once. In the example, >> copying >> -proceeds in the following order: @samp{val}, @samp{name} (via >> -@code{strdup}), @samp{bval}, and @samp{name} again. >> +proceeds in the following order: @samp{name} (via @code{strdup}), >> +@samp{val}, @samp{name} again, and @samp{bval}. >> >> If application code relies on copy-assignment, a user-defined >> copy-assignment operator removes any uncertainties. With such an >
diff --git a/gcc/doc/trouble.texi b/gcc/doc/trouble.texi index 40c51ae21cb..8b34be4aa63 100644 --- a/gcc/doc/trouble.texi +++ b/gcc/doc/trouble.texi @@ -865,10 +865,11 @@ objects behave unspecified when being assigned. For example: @smallexample struct Base@{ char *name; - Base(char *n) : name(strdup(n))@{@} + Base(const char *n) : name(strdup(n))@{@} Base& operator= (const Base& other)@{ free (name); name = strdup (other.name); + return *this; @} @}; @@ -901,8 +902,8 @@ inside @samp{func} in the example). G++ implements the ``intuitive'' algorithm for copy-assignment: assign all direct bases, then assign all members. In that algorithm, the virtual base subobject can be encountered more than once. In the example, copying -proceeds in the following order: @samp{val}, @samp{name} (via -@code{strdup}), @samp{bval}, and @samp{name} again. +proceeds in the following order: @samp{name} (via @code{strdup}), +@samp{val}, @samp{name} again, and @samp{bval}. If application code relies on copy-assignment, a user-defined copy-assignment operator removes any uncertainties. With such an