Re: [wwwdocs] Document C++ null pointer constant changes in gcc-7/porting_to.html
On 09/04/17 19:58 -0600, Sandra Loosemore wrote: On 04/07/2017 03:25 AM, Jonathan Wakely wrote: This issue caused a lot of build failures during the GCC mass rebuilds for Fedora, but isn't in the porting to guide yet. Is this accurate and clear enough for casual readers? Index: htdocs/gcc-7/porting_to.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-7/porting_to.html,v retrieving revision 1.13 diff -u -r1.13 porting_to.html --- htdocs/gcc-7/porting_to.html6 Apr 2017 17:12:16 - 1.13 +++ htdocs/gcc-7/porting_to.html7 Apr 2017 09:25:06 - @@ -118,6 +118,39 @@ with GCC 7 and some are compiled with older releases. +Null pointer constants + + +When compiling as C++11 or later, GCC 7 follows the revised definition of a +null pointer constant. This means conversions to pointers from other +types of constant (such as character literals and boolean literals) will now +be rejected. + Nit pick: s/will now be rejected/are now rejected/ since "now" means we are describing GCC's current behavior, not future behavior. :-) If you write such code (or try to compile existing code like that) it will now be rejected - that's the first conditional isn't it? "It's started raining and if you go outside again you will now get wet." Anyway, I've committed the attached patch with that change and a similar one you noted previously for GCC 5. ? htdocs/gcc-7/porting_to.TODO Index: htdocs/gcc-5/porting_to.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-5/porting_to.html,v retrieving revision 1.11 diff -u -r1.11 porting_to.html --- htdocs/gcc-5/porting_to.html 21 Jan 2016 22:20:29 - 1.11 +++ htdocs/gcc-5/porting_to.html 10 Apr 2017 11:48:09 - @@ -398,7 +398,7 @@ GCC 5 implements http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1579";>DR 1579 -which means that in a function like: +which means that when compiling a function like: X @@ -409,17 +409,17 @@ } -GCC will first attempt to construct the return value as if y -were an rvalue, and if that fails then it will try again for an lvalue +GCC first attempts to construct the return value as though y +were an rvalue, and if that fails then it tries again using an lvalue (all C++11 compilers already do this when returning a variable of the -same type as the function returns, but now they are required to do it +same type as the function returns, but now they are also required to do it when the types are not the same). -This will change the constructor that gets called in some cases, +This changes the constructor that gets called in some cases, for example it might now call X(Y&&) instead of X(const Y&). -In most cases the only observable difference will be code that runs faster +In most cases the only observable difference is code that runs faster (by moving instead of copying) but if it causes a problem the new behavior can be prevented by ensuring the compiler treats y as an lvalue, using return X(y); or Index: htdocs/gcc-7/porting_to.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-7/porting_to.html,v retrieving revision 1.13 diff -u -r1.13 porting_to.html --- htdocs/gcc-7/porting_to.html 6 Apr 2017 17:12:16 - 1.13 +++ htdocs/gcc-7/porting_to.html 10 Apr 2017 11:48:09 - @@ -118,6 +118,39 @@ with GCC 7 and some are compiled with older releases. +Null pointer constants + + +When compiling as C++11 or later, GCC 7 follows the revised definition of a +null pointer constant. This means conversions to pointers from other +types of constant (such as character literals and boolean literals) are now +rejected. + + +void* f() { + char* p = '\0'; + return false; +} + + + +error: invalid conversion from 'char' to 'char*' [-fpermissive] + char* p = '\0'; + ^~~~ +error: cannot convert 'bool' to 'void*' in return + return false; + ^ + + + +Such code should be fixed to use a valid null pointer constant such as +0 or nullptr. Care should be taken when fixing +invalid uses of '\0' as a pointer, as it may not be clear whether +the intention was to create a null pointer (p = 0;), to create an +empty string (p = "";), or to write a null terminator to the +string (*p = '\0';). + + Header dependency changes
Re: [wwwdocs] Document C++ null pointer constant changes in gcc-7/porting_to.html
On 04/07/2017 03:25 AM, Jonathan Wakely wrote: This issue caused a lot of build failures during the GCC mass rebuilds for Fedora, but isn't in the porting to guide yet. Is this accurate and clear enough for casual readers? Index: htdocs/gcc-7/porting_to.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-7/porting_to.html,v retrieving revision 1.13 diff -u -r1.13 porting_to.html --- htdocs/gcc-7/porting_to.html6 Apr 2017 17:12:16 - 1.13 +++ htdocs/gcc-7/porting_to.html7 Apr 2017 09:25:06 - @@ -118,6 +118,39 @@ with GCC 7 and some are compiled with older releases. +Null pointer constants + + +When compiling as C++11 or later, GCC 7 follows the revised definition of a +null pointer constant. This means conversions to pointers from other +types of constant (such as character literals and boolean literals) will now +be rejected. + Nit pick: s/will now be rejected/are now rejected/ since "now" means we are describing GCC's current behavior, not future behavior. :-) -Sandra
Re: [wwwdocs] Document C++ null pointer constant changes in gcc-7/porting_to.html
On Fri, Apr 07, 2017 at 10:25:21AM +0100, Jonathan Wakely wrote: > This issue caused a lot of build failures during the GCC mass rebuilds > for Fedora, but isn't in the porting to guide yet. > > Is this accurate and clear enough for casual readers? Looks fine to me. > Index: htdocs/gcc-7/porting_to.html > === > RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-7/porting_to.html,v > retrieving revision 1.13 > diff -u -r1.13 porting_to.html > --- htdocs/gcc-7/porting_to.html 6 Apr 2017 17:12:16 - 1.13 > +++ htdocs/gcc-7/porting_to.html 7 Apr 2017 09:25:06 - > @@ -118,6 +118,39 @@ > with GCC 7 and some are compiled with older releases. > > > +Null pointer constants > + > + > +When compiling as C++11 or later, GCC 7 follows the revised definition of a > +null pointer constant. This means conversions to pointers from other > +types of constant (such as character literals and boolean literals) will now > +be rejected. > + > + > +void* f() { > + char* p = '\0'; > + return false; > +} > + > + > + > +error: invalid conversion from 'char' to > 'char*' [-fpermissive] > + char* p = '\0'; > + ^~~~ > +error: cannot convert 'bool' to > 'void*' in return > + return false; > + ^ > + > + > + > +Such code should be fixed to use a valid null pointer constant such as > +0 or nullptr. Care should be taken when fixing > +invalid uses of '\0' as a pointer, as it may not be clear > whether > +the intention was to create a null pointer (p = 0;), to create > an > +empty string (p = "";), or to write a null terminator to the > +string (*p = '\0';). > + > + > Header dependency changes > > Marek
[wwwdocs] Document C++ null pointer constant changes in gcc-7/porting_to.html
This issue caused a lot of build failures during the GCC mass rebuilds for Fedora, but isn't in the porting to guide yet. Is this accurate and clear enough for casual readers? Index: htdocs/gcc-7/porting_to.html === RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-7/porting_to.html,v retrieving revision 1.13 diff -u -r1.13 porting_to.html --- htdocs/gcc-7/porting_to.html 6 Apr 2017 17:12:16 - 1.13 +++ htdocs/gcc-7/porting_to.html 7 Apr 2017 09:25:06 - @@ -118,6 +118,39 @@ with GCC 7 and some are compiled with older releases. +Null pointer constants + + +When compiling as C++11 or later, GCC 7 follows the revised definition of a +null pointer constant. This means conversions to pointers from other +types of constant (such as character literals and boolean literals) will now +be rejected. + + +void* f() { + char* p = '\0'; + return false; +} + + + +error: invalid conversion from 'char' to 'char*' [-fpermissive] + char* p = '\0'; + ^~~~ +error: cannot convert 'bool' to 'void*' in return + return false; + ^ + + + +Such code should be fixed to use a valid null pointer constant such as +0 or nullptr. Care should be taken when fixing +invalid uses of '\0' as a pointer, as it may not be clear whether +the intention was to create a null pointer (p = 0;), to create an +empty string (p = "";), or to write a null terminator to the +string (*p = '\0';). + + Header dependency changes