Re: Implement P0001R1 - C++17 removal of register storage class specifier
OK. On Fri, Sep 30, 2016 at 7:28 PM, Jakub Jelinekwrote: > On Fri, Sep 30, 2016 at 05:32:31PM -0400, Jason Merrill wrote: >> On Fri, Sep 30, 2016 at 4:10 AM, Jakub Jelinek wrote: >> > On Thu, Sep 29, 2016 at 10:57:07PM +, Joseph Myers wrote: >> >> This is missing documentation of the new -Wregister option in invoke.texi. >> > >> > While I had it in my head when working on the patch, I forgot to do that >> > in the end. >> > Fixed thusly, ok for trunk? >> >> OK. But also, the patch has introduced several check-c++1z failures: >> >> > FAIL: g++.dg/charset/asm2.c -std=c++1z (test for excess errors) >> > FAIL: g++.dg/ext/asm3.C -std=c++1z (test for excess errors) >> > FAIL: g++.dg/tls/diag-2.C -std=c++1z (test for excess errors) >> > FAIL: g++.dg/tls/diag-4.C -std=c++1z (test for excess errors) >> > FAIL: g++.old-deja/g++.brendan/warnings4.C -std=c++1z (test for excess >> > errors) >> > FAIL: g++.old-deja/g++.eh/ia64-1.C -std=gnu++1z (test for excess errors) >> > FAIL: g++.old-deja/g++.jason/enum3.C -std=gnu++1z (test for excess errors) >> > FAIL: g++.old-deja/g++.mike/net31.C -std=c++1z (test for excess errors) >> > FAIL: g++.old-deja/g++.mike/p700.C -std=gnu++1z (test for excess errors) >> > FAIL: g++.old-deja/g++.other/regstack.C -std=gnu++1z (test for excess >> > errors) > > Oops, I've been planning to do check-c++-all after the bootstrap/regtest, > but apparently forgot to do that in the end. > > The following patch should fix that, ok for trunk? > > 2016-10-01 Jakub Jelinek > > * g++.dg/ext/asm3.C (two): Only use register keyword for C++14 and > earlier. > * g++.dg/charset/asm2.c (memmove): Likewise. > * g++.dg/tls/diag-2.C (foo): Expect -Wregister error for C++17. > * g++.dg/tls/diag-4.C (foo): Likewise. > * c-c++-common/vector-subscript-2.c (vf): Change dg-error to > dg-warning, fix up regex. > * g++.old-deja/g++.brendan/warnings4.C: Limit to c++14_down targets. > * g++.old-deja/g++.mike/p700.C: Add -Wno-register. > * g++.old-deja/g++.mike/net31.C: Likewise. > * g++.old-deja/g++.other/regstack.C (foo): Expect -Wregister warning > for C++17. > * g++.old-deja/g++.jason/enum3.C: Add -Wno-register. > * g++.old-deja/g++.eh/ia64-1.C: Likewise. > > --- gcc/testsuite/g++.dg/ext/asm3.C.jj 2014-09-25 15:02:34.0 +0200 > +++ gcc/testsuite/g++.dg/ext/asm3.C 2016-10-01 01:00:53.107415429 +0200 > @@ -7,9 +7,12 @@ > > int two(int in) > { > - register int out; > +#if __cplusplus <= 201402L > + register > +#endif > + int out; >__asm__ ("" : "r" (out) : "r" (in)); >return out; > } > > -// { dg-message "error:" "" { target *-*-* } 11 } > +// { dg-message "error:" "" { target *-*-* } 14 } > --- gcc/testsuite/g++.dg/charset/asm2.c.jj 2014-09-25 15:02:36.0 > +0200 > +++ gcc/testsuite/g++.dg/charset/asm2.c 2016-10-01 00:58:59.594839475 +0200 > @@ -10,7 +10,10 @@ > void * > memmove (void *__dest, __const void *__src, size_t __n) > { > - register unsigned long int __d0, __d1, __d2; > +#if __cplusplus <= 201402L > + register > +#endif > + unsigned long int __d0, __d1, __d2; >if (__dest < __src) > __asm__ __volatile__ >("cld\n\t" > --- gcc/testsuite/g++.dg/tls/diag-2.C.jj2014-09-25 15:02:36.0 > +0200 > +++ gcc/testsuite/g++.dg/tls/diag-2.C 2016-10-01 01:03:03.002785384 +0200 > @@ -12,7 +12,7 @@ void foo() >auto __thread int l2;/* { dg-error "multiple storage > classes|data types" } */ >__thread extern int l3; /* { dg-error "'__thread' before 'extern'" } > */ >register __thread int l4;/* { dg-error "multiple storage classes" } */ > -} > +} /* { dg-error "ISO C\\+\\+1z does not allow > 'register' storage class specifier" "" { target c++1z } .-1 } */ > > __thread void f1 (); /* { dg-error "invalid for function" } */ > extern __thread void f2 ();/* { dg-error "invalid for function" } */ > --- gcc/testsuite/g++.dg/tls/diag-4.C.jj2014-09-25 15:02:36.0 > +0200 > +++ gcc/testsuite/g++.dg/tls/diag-4.C 2016-10-01 01:03:28.986458585 +0200 > @@ -7,4 +7,4 @@ void foo() > { >__thread auto int l2;/* { dg-error "multiple storage > classes|data types" } */ >__thread register int l4;/* { dg-error "multiple storage classes" } */ > -} > +} /* { dg-error "ISO C\\+\\+1z does not allow > 'register' storage class specifier" "" { target c++1z } .-1 } */ > --- gcc/testsuite/c-c++-common/vector-subscript-2.c.jj 2016-09-30 > 18:40:58.335979346 +0200 > +++ gcc/testsuite/c-c++-common/vector-subscript-2.c 2016-10-01 > 01:22:19.577245968 +0200 > @@ -7,6 +7,6 @@ > > float vf(int i) > { > - register vector float a; // { dg-error "ISO C++1z does not allow > 'register' storage class specifier" "" { target c++1z } } > +
Re: Implement P0001R1 - C++17 removal of register storage class specifier
On Fri, Sep 30, 2016 at 05:32:31PM -0400, Jason Merrill wrote: > On Fri, Sep 30, 2016 at 4:10 AM, Jakub Jelinekwrote: > > On Thu, Sep 29, 2016 at 10:57:07PM +, Joseph Myers wrote: > >> This is missing documentation of the new -Wregister option in invoke.texi. > > > > While I had it in my head when working on the patch, I forgot to do that in > > the end. > > Fixed thusly, ok for trunk? > > OK. But also, the patch has introduced several check-c++1z failures: > > > FAIL: g++.dg/charset/asm2.c -std=c++1z (test for excess errors) > > FAIL: g++.dg/ext/asm3.C -std=c++1z (test for excess errors) > > FAIL: g++.dg/tls/diag-2.C -std=c++1z (test for excess errors) > > FAIL: g++.dg/tls/diag-4.C -std=c++1z (test for excess errors) > > FAIL: g++.old-deja/g++.brendan/warnings4.C -std=c++1z (test for excess > > errors) > > FAIL: g++.old-deja/g++.eh/ia64-1.C -std=gnu++1z (test for excess errors) > > FAIL: g++.old-deja/g++.jason/enum3.C -std=gnu++1z (test for excess errors) > > FAIL: g++.old-deja/g++.mike/net31.C -std=c++1z (test for excess errors) > > FAIL: g++.old-deja/g++.mike/p700.C -std=gnu++1z (test for excess errors) > > FAIL: g++.old-deja/g++.other/regstack.C -std=gnu++1z (test for excess > > errors) Oops, I've been planning to do check-c++-all after the bootstrap/regtest, but apparently forgot to do that in the end. The following patch should fix that, ok for trunk? 2016-10-01 Jakub Jelinek * g++.dg/ext/asm3.C (two): Only use register keyword for C++14 and earlier. * g++.dg/charset/asm2.c (memmove): Likewise. * g++.dg/tls/diag-2.C (foo): Expect -Wregister error for C++17. * g++.dg/tls/diag-4.C (foo): Likewise. * c-c++-common/vector-subscript-2.c (vf): Change dg-error to dg-warning, fix up regex. * g++.old-deja/g++.brendan/warnings4.C: Limit to c++14_down targets. * g++.old-deja/g++.mike/p700.C: Add -Wno-register. * g++.old-deja/g++.mike/net31.C: Likewise. * g++.old-deja/g++.other/regstack.C (foo): Expect -Wregister warning for C++17. * g++.old-deja/g++.jason/enum3.C: Add -Wno-register. * g++.old-deja/g++.eh/ia64-1.C: Likewise. --- gcc/testsuite/g++.dg/ext/asm3.C.jj 2014-09-25 15:02:34.0 +0200 +++ gcc/testsuite/g++.dg/ext/asm3.C 2016-10-01 01:00:53.107415429 +0200 @@ -7,9 +7,12 @@ int two(int in) { - register int out; +#if __cplusplus <= 201402L + register +#endif + int out; __asm__ ("" : "r" (out) : "r" (in)); return out; } -// { dg-message "error:" "" { target *-*-* } 11 } +// { dg-message "error:" "" { target *-*-* } 14 } --- gcc/testsuite/g++.dg/charset/asm2.c.jj 2014-09-25 15:02:36.0 +0200 +++ gcc/testsuite/g++.dg/charset/asm2.c 2016-10-01 00:58:59.594839475 +0200 @@ -10,7 +10,10 @@ void * memmove (void *__dest, __const void *__src, size_t __n) { - register unsigned long int __d0, __d1, __d2; +#if __cplusplus <= 201402L + register +#endif + unsigned long int __d0, __d1, __d2; if (__dest < __src) __asm__ __volatile__ ("cld\n\t" --- gcc/testsuite/g++.dg/tls/diag-2.C.jj2014-09-25 15:02:36.0 +0200 +++ gcc/testsuite/g++.dg/tls/diag-2.C 2016-10-01 01:03:03.002785384 +0200 @@ -12,7 +12,7 @@ void foo() auto __thread int l2;/* { dg-error "multiple storage classes|data types" } */ __thread extern int l3; /* { dg-error "'__thread' before 'extern'" } */ register __thread int l4;/* { dg-error "multiple storage classes" } */ -} +} /* { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } .-1 } */ __thread void f1 (); /* { dg-error "invalid for function" } */ extern __thread void f2 ();/* { dg-error "invalid for function" } */ --- gcc/testsuite/g++.dg/tls/diag-4.C.jj2014-09-25 15:02:36.0 +0200 +++ gcc/testsuite/g++.dg/tls/diag-4.C 2016-10-01 01:03:28.986458585 +0200 @@ -7,4 +7,4 @@ void foo() { __thread auto int l2;/* { dg-error "multiple storage classes|data types" } */ __thread register int l4;/* { dg-error "multiple storage classes" } */ -} +} /* { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } .-1 } */ --- gcc/testsuite/c-c++-common/vector-subscript-2.c.jj 2016-09-30 18:40:58.335979346 +0200 +++ gcc/testsuite/c-c++-common/vector-subscript-2.c 2016-10-01 01:22:19.577245968 +0200 @@ -7,6 +7,6 @@ float vf(int i) { - register vector float a; // { dg-error "ISO C++1z does not allow 'register' storage class specifier" "" { target c++1z } } + register vector float a; // { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } } return a[0]; } --- gcc/testsuite/g++.old-deja/g++.brendan/warnings4.C.jj 2014-09-25 15:02:10.0 +0200 +++
Re: Implement P0001R1 - C++17 removal of register storage class specifier
On Fri, Sep 30, 2016 at 4:10 AM, Jakub Jelinekwrote: > Hi! > > On Thu, Sep 29, 2016 at 10:57:07PM +, Joseph Myers wrote: >> This is missing documentation of the new -Wregister option in invoke.texi. > > While I had it in my head when working on the patch, I forgot to do that in > the end. > Fixed thusly, ok for trunk? OK. But also, the patch has introduced several check-c++1z failures: > FAIL: g++.dg/charset/asm2.c -std=c++1z (test for excess errors) > FAIL: g++.dg/ext/asm3.C -std=c++1z (test for excess errors) > FAIL: g++.dg/tls/diag-2.C -std=c++1z (test for excess errors) > FAIL: g++.dg/tls/diag-4.C -std=c++1z (test for excess errors) > FAIL: g++.old-deja/g++.brendan/warnings4.C -std=c++1z (test for excess > errors) > FAIL: g++.old-deja/g++.eh/ia64-1.C -std=gnu++1z (test for excess errors) > FAIL: g++.old-deja/g++.jason/enum3.C -std=gnu++1z (test for excess errors) > FAIL: g++.old-deja/g++.mike/net31.C -std=c++1z (test for excess errors) > FAIL: g++.old-deja/g++.mike/p700.C -std=gnu++1z (test for excess errors) > FAIL: g++.old-deja/g++.other/regstack.C -std=gnu++1z (test for excess errors)
Re: Implement P0001R1 - C++17 removal of register storage class specifier
Hi! On Thu, Sep 29, 2016 at 10:57:07PM +, Joseph Myers wrote: > This is missing documentation of the new -Wregister option in invoke.texi. While I had it in my head when working on the patch, I forgot to do that in the end. Fixed thusly, ok for trunk? 2016-09-30 Jakub Jelinek* doc/invoke.texi (-Wregister): Document. --- gcc/doc/invoke.texi.jj 2016-09-29 22:53:11.0 +0200 +++ gcc/doc/invoke.texi 2016-09-30 09:55:28.819581224 +0200 @@ -213,7 +213,7 @@ in the following sections. -Wabi=@var{n} -Wabi-tag -Wconversion-null -Wctor-dtor-privacy @gol -Wdelete-non-virtual-dtor -Wliteral-suffix -Wmultiple-inheritance @gol -Wnamespaces -Wnarrowing @gol --Wnoexcept -Wnon-virtual-dtor -Wreorder @gol +-Wnoexcept -Wnon-virtual-dtor -Wreorder -Wregister @gol -Weffc++ -Wstrict-null-sentinel -Wtemplates @gol -Wno-non-template-friend -Wold-style-cast @gol -Woverloaded-virtual -Wno-pmf-conversions @gol @@ -2840,6 +2840,15 @@ case it is possible but unsafe to delete class through a pointer to the class itself or base class. This warning is automatically enabled if @option{-Weffc++} is specified. +@item -Wregister @r{(C++ and Objective-C++ only)} +@opindex Wregister +@opindex Wno-register +Warn on uses of the @code{register} storage class specifier, except +when it is part of the GNU @ref{Explicit Register Variables} extension. +The use of the @code{register} keyword as storage class specifier has +been deprecated in C++11 and removed in C++17. +Enabled by default with @option{-std=c++1z}. + @item -Wreorder @r{(C++ and Objective-C++ only)} @opindex Wreorder @opindex Wno-reorder Jakub
Re: Implement P0001R1 - C++17 removal of register storage class specifier
This is missing documentation of the new -Wregister option in invoke.texi. -- Joseph S. Myers jos...@codesourcery.com
Re: Implement P0001R1 - C++17 removal of register storage class specifier
OK. On Thu, Sep 29, 2016 at 4:21 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > This patch pedwarns in C++17 on register storage class specifier, unless > it is diagnosed errorneous for other reasons and unless it is used in the > GNU global or local register variable extension. Even in C++17, users can > use -Wno-register to suppress the pedwarn, and for C++98-C++14 users can on > the other side use -Wregister to get warning about it. Clang seems to > warn/error out similarly on variables with register storage class under > -Wregister too, is quiet about the uses in register int var __asm ("...") > (global and local), though strangely doesn't complain about register > keywords on function arguments, which this patch diagnoses. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2016-09-29 Jakub Jelinek <ja...@redhat.com> > > Implement P0001R1 - C++17 removal of register storage class specifier > c-family/ > * c.opt (Wregister): New warning. > * c-opts.c (c_common_post_options): Enable -Wregister by > default for C++17. > cp/ > * decl.c (cp_finish_decl): Diagnose register storage class > on vars except when used in GNU global or local register variable > extension. > (grokdeclarator): Diagnose register storage class on parameters. > * except.c (expand_start_catch_block): Set DECL_REGISTER only > after cp_finish_decl call. > testsuite/ > * c-c++-common/Wvarargs-2.c (foo1): Except new warning for C++17. > * c-c++-common/vector-subscript-2.c (vf): Expect new error for > C++17. > * c-c++-common/vector-subscript-5.c (foo): Don't use register > keyword if not __SSE2__. > * c-c++-common/Wvarargs.c (foo1, foo3): Expect new warnings for > C++17. > * g++.dg/compat/struct-layout-1_generate.c (iterative_hash): Remove > register keywords. > * g++.dg/eh/pr29166.C: Add -Wno-register option. > * g++.dg/warn/register-parm-1.C (erroneous_warning, > no_erroneous_warning): Expect new warnings for C++17. > * g++.dg/warn/register-var-2.C (f): Likewise. > * g++.dg/parse/register1.C (f): Expect new error for C++17. > * g++.dg/parse/linkage2.C (foo): Likewise. > * g++.dg/torture/pr36826.C (CoinMin, CoinMax): Avoid register > keyword on parameters for C++17. > * g++.dg/cpp1z/register1.C: New test. > * g++.dg/cpp1z/register2.C: New test. > * g++.dg/cpp1z/register3.C: New test. > > --- gcc/c-family/c.opt.jj 2016-09-26 12:06:37.0 +0200 > +++ gcc/c-family/c.opt 2016-09-29 14:54:17.712047430 +0200 > @@ -842,6 +842,10 @@ Wredundant-decls > C ObjC C++ ObjC++ Var(warn_redundant_decls) Warning > Warn about multiple declarations of the same object. > > +Wregister > +C++ ObjC++ Var(warn_register) Warning > +Warn about uses of register storage specifier. > + > Wreorder > C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall) > Warn when the compiler reorders code. > --- gcc/c-family/c-opts.c.jj2016-08-19 11:04:38.0 +0200 > +++ gcc/c-family/c-opts.c 2016-09-29 15:06:06.213254295 +0200 > @@ -871,6 +871,10 @@ c_common_post_options (const char **pfil > warn_shift_negative_value = (extra_warnings > && (cxx_dialect >= cxx11 || flag_isoc99)); > > + /* -Wregister is enabled by default in C++17. */ > + if (!global_options_set.x_warn_register) > +warn_register = cxx_dialect >= cxx1z; > + >/* Declone C++ 'structors if -Os. */ >if (flag_declone_ctor_dtor == -1) > flag_declone_ctor_dtor = optimize_size; > --- gcc/cp/decl.c.jj2016-09-23 19:37:41.0 +0200 > +++ gcc/cp/decl.c 2016-09-29 16:05:03.724470275 +0200 > @@ -6711,6 +6711,19 @@ cp_finish_decl (tree decl, tree init, bo >if (type == error_mark_node) > return; > > + /* Warn about register storage specifiers except when in GNU global > + or local register variable extension. */ > + if (VAR_P (decl) && DECL_REGISTER (decl) && asmspec_tree == NULL_TREE) > +{ > + if (cxx_dialect >= cxx1z) > + pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wregister, > +"ISO C++1z does not allow %<register%> storage " > +"class specifier"); > + else > + warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wregister, > + "%<register%> storage class specifier used"); > +} > + >/* If a name was specified, get the string. */ >if (at_namespace_scope_p ()) &g
Implement P0001R1 - C++17 removal of register storage class specifier
Hi! This patch pedwarns in C++17 on register storage class specifier, unless it is diagnosed errorneous for other reasons and unless it is used in the GNU global or local register variable extension. Even in C++17, users can use -Wno-register to suppress the pedwarn, and for C++98-C++14 users can on the other side use -Wregister to get warning about it. Clang seems to warn/error out similarly on variables with register storage class under -Wregister too, is quiet about the uses in register int var __asm ("...") (global and local), though strangely doesn't complain about register keywords on function arguments, which this patch diagnoses. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-09-29 Jakub Jelinek <ja...@redhat.com> Implement P0001R1 - C++17 removal of register storage class specifier c-family/ * c.opt (Wregister): New warning. * c-opts.c (c_common_post_options): Enable -Wregister by default for C++17. cp/ * decl.c (cp_finish_decl): Diagnose register storage class on vars except when used in GNU global or local register variable extension. (grokdeclarator): Diagnose register storage class on parameters. * except.c (expand_start_catch_block): Set DECL_REGISTER only after cp_finish_decl call. testsuite/ * c-c++-common/Wvarargs-2.c (foo1): Except new warning for C++17. * c-c++-common/vector-subscript-2.c (vf): Expect new error for C++17. * c-c++-common/vector-subscript-5.c (foo): Don't use register keyword if not __SSE2__. * c-c++-common/Wvarargs.c (foo1, foo3): Expect new warnings for C++17. * g++.dg/compat/struct-layout-1_generate.c (iterative_hash): Remove register keywords. * g++.dg/eh/pr29166.C: Add -Wno-register option. * g++.dg/warn/register-parm-1.C (erroneous_warning, no_erroneous_warning): Expect new warnings for C++17. * g++.dg/warn/register-var-2.C (f): Likewise. * g++.dg/parse/register1.C (f): Expect new error for C++17. * g++.dg/parse/linkage2.C (foo): Likewise. * g++.dg/torture/pr36826.C (CoinMin, CoinMax): Avoid register keyword on parameters for C++17. * g++.dg/cpp1z/register1.C: New test. * g++.dg/cpp1z/register2.C: New test. * g++.dg/cpp1z/register3.C: New test. --- gcc/c-family/c.opt.jj 2016-09-26 12:06:37.0 +0200 +++ gcc/c-family/c.opt 2016-09-29 14:54:17.712047430 +0200 @@ -842,6 +842,10 @@ Wredundant-decls C ObjC C++ ObjC++ Var(warn_redundant_decls) Warning Warn about multiple declarations of the same object. +Wregister +C++ ObjC++ Var(warn_register) Warning +Warn about uses of register storage specifier. + Wreorder C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall) Warn when the compiler reorders code. --- gcc/c-family/c-opts.c.jj2016-08-19 11:04:38.0 +0200 +++ gcc/c-family/c-opts.c 2016-09-29 15:06:06.213254295 +0200 @@ -871,6 +871,10 @@ c_common_post_options (const char **pfil warn_shift_negative_value = (extra_warnings && (cxx_dialect >= cxx11 || flag_isoc99)); + /* -Wregister is enabled by default in C++17. */ + if (!global_options_set.x_warn_register) +warn_register = cxx_dialect >= cxx1z; + /* Declone C++ 'structors if -Os. */ if (flag_declone_ctor_dtor == -1) flag_declone_ctor_dtor = optimize_size; --- gcc/cp/decl.c.jj2016-09-23 19:37:41.0 +0200 +++ gcc/cp/decl.c 2016-09-29 16:05:03.724470275 +0200 @@ -6711,6 +6711,19 @@ cp_finish_decl (tree decl, tree init, bo if (type == error_mark_node) return; + /* Warn about register storage specifiers except when in GNU global + or local register variable extension. */ + if (VAR_P (decl) && DECL_REGISTER (decl) && asmspec_tree == NULL_TREE) +{ + if (cxx_dialect >= cxx1z) + pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wregister, +"ISO C++1z does not allow %<register%> storage " +"class specifier"); + else + warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wregister, + "%<register%> storage class specifier used"); +} + /* If a name was specified, get the string. */ if (at_namespace_scope_p ()) asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree); @@ -11634,7 +11647,20 @@ grokdeclarator (const cp_declarator *dec and in case doing stupid register allocation. */ if (storage_class == sc_register) - DECL_REGISTER (decl) = 1; + { + DECL_REGISTER (decl) = 1; + /* Warn about register storage specifiers on PARM_DECLs. */ + if (TREE_CODE (decl) == PARM_DECL) + { + if (cxx_dialect >= cxx1z) + pedwarn (DECL_SOURCE_LOCATION (decl), OPT_Wregister, +