aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/decl.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-09-29 22:54:56 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-09-29 22:54:56 +0200
commita2c6e7f26ec122124c91ca215a285da69d19fac9 (patch)
treeb3e64a502f5b3a95fa0f9261eb01a744d71fd489 /gcc/cp/decl.c
parent0a2d7bc05a7de689cb3fde82109e74a0b72e535c (diff)
downloadgcc-a2c6e7f26ec122124c91ca215a285da69d19fac9.zip
gcc-a2c6e7f26ec122124c91ca215a285da69d19fac9.tar.gz
gcc-a2c6e7f26ec122124c91ca215a285da69d19fac9.tar.bz2
Implement P0001R1 - C++17 removal of register storage class specifier c-family/
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. From-SVN: r240638
Diffstat (limited to 'gcc/cp/decl.c')
-rw-r--r--gcc/cp/decl.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3dfa042..65966f8 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6711,6 +6711,19 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
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 *declarator,
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,
+ "ISO C++1z does not allow %<register%> storage "
+ "class specifier");
+ else
+ warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wregister,
+ "%<register%> storage class specifier used");
+ }
+ }
else if (storage_class == sc_extern)
DECL_THIS_EXTERN (decl) = 1;
else if (storage_class == sc_static)