Re: Implement P0001R1 - C++17 removal of register storage class specifier

2016-10-02 Thread Jason Merrill
OK.

On Fri, Sep 30, 2016 at 7:28 PM, Jakub Jelinek  wrote:
> 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

2016-09-30 Thread Jakub Jelinek
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 } }
+  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

2016-09-30 Thread Jason Merrill
On Fri, Sep 30, 2016 at 4:10 AM, Jakub Jelinek  wrote:
> 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

2016-09-30 Thread Jakub Jelinek
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

2016-09-29 Thread Joseph Myers
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

2016-09-29 Thread Jason Merrill
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

2016-09-29 Thread Jakub Jelinek
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,
+