mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
0a2d7bc05a
commit
a2c6e7f26e
|
|
@ -1,3 +1,10 @@
|
||||||
|
2016-09-29 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
Implement P0001R1 - C++17 removal of register storage class specifier
|
||||||
|
* c.opt (Wregister): New warning.
|
||||||
|
* c-opts.c (c_common_post_options): Enable -Wregister by
|
||||||
|
default for C++17.
|
||||||
|
|
||||||
2016-09-29 James Greenhalgh <james.greenhalgh@arm.com>
|
2016-09-29 James Greenhalgh <james.greenhalgh@arm.com>
|
||||||
|
|
||||||
* c-opts.c (c_common_post_options): Remove special case for
|
* c-opts.c (c_common_post_options): Remove special case for
|
||||||
|
|
|
||||||
|
|
@ -870,6 +870,10 @@ c_common_post_options (const char **pfilename)
|
||||||
warn_shift_negative_value = (extra_warnings
|
warn_shift_negative_value = (extra_warnings
|
||||||
&& (cxx_dialect >= cxx11 || flag_isoc99));
|
&& (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. */
|
/* Declone C++ 'structors if -Os. */
|
||||||
if (flag_declone_ctor_dtor == -1)
|
if (flag_declone_ctor_dtor == -1)
|
||||||
flag_declone_ctor_dtor = optimize_size;
|
flag_declone_ctor_dtor = optimize_size;
|
||||||
|
|
|
||||||
|
|
@ -842,6 +842,10 @@ Wredundant-decls
|
||||||
C ObjC C++ ObjC++ Var(warn_redundant_decls) Warning
|
C ObjC C++ ObjC++ Var(warn_redundant_decls) Warning
|
||||||
Warn about multiple declarations of the same object.
|
Warn about multiple declarations of the same object.
|
||||||
|
|
||||||
|
Wregister
|
||||||
|
C++ ObjC++ Var(warn_register) Warning
|
||||||
|
Warn about uses of register storage specifier.
|
||||||
|
|
||||||
Wreorder
|
Wreorder
|
||||||
C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall)
|
C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall)
|
||||||
Warn when the compiler reorders code.
|
Warn when the compiler reorders code.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,13 @@
|
||||||
|
2016-09-29 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
Implement P0001R1 - C++17 removal of register storage class specifier
|
||||||
|
* 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.
|
||||||
|
|
||||||
2016-09-29 Marek Polacek <polacek@redhat.com>
|
2016-09-29 Marek Polacek <polacek@redhat.com>
|
||||||
|
|
||||||
* rtti.c (involves_incomplete_p): Add fall through comment.
|
* rtti.c (involves_incomplete_p): Add fall through comment.
|
||||||
|
|
|
||||||
|
|
@ -6711,6 +6711,19 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
|
||||||
if (type == error_mark_node)
|
if (type == error_mark_node)
|
||||||
return;
|
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 a name was specified, get the string. */
|
||||||
if (at_namespace_scope_p ())
|
if (at_namespace_scope_p ())
|
||||||
asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree);
|
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. */
|
and in case doing stupid register allocation. */
|
||||||
|
|
||||||
if (storage_class == sc_register)
|
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)
|
else if (storage_class == sc_extern)
|
||||||
DECL_THIS_EXTERN (decl) = 1;
|
DECL_THIS_EXTERN (decl) = 1;
|
||||||
else if (storage_class == sc_static)
|
else if (storage_class == sc_static)
|
||||||
|
|
|
||||||
|
|
@ -540,9 +540,9 @@ expand_start_catch_block (tree decl)
|
||||||
if (init_type != TREE_TYPE (init))
|
if (init_type != TREE_TYPE (init))
|
||||||
init = build1 (NOP_EXPR, init_type, init);
|
init = build1 (NOP_EXPR, init_type, init);
|
||||||
exp = create_temporary_var (init_type);
|
exp = create_temporary_var (init_type);
|
||||||
DECL_REGISTER (exp) = 1;
|
|
||||||
cp_finish_decl (exp, init, /*init_const_expr=*/false,
|
cp_finish_decl (exp, init, /*init_const_expr=*/false,
|
||||||
NULL_TREE, LOOKUP_ONLYCONVERTING);
|
NULL_TREE, LOOKUP_ONLYCONVERTING);
|
||||||
|
DECL_REGISTER (exp) = 1;
|
||||||
initialize_handler_parm (decl, exp);
|
initialize_handler_parm (decl, exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,27 @@
|
||||||
|
2016-09-29 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
Implement P0001R1 - C++17 removal of register storage class specifier
|
||||||
|
* 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.
|
||||||
|
|
||||||
2016-09-29 Uros Bizjak <ubizjak@gmail.com>
|
2016-09-29 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
* gcc.target/i386/adx-check.h (main): Simplify feature bit tests.
|
* gcc.target/i386/adx-check.h (main): Simplify feature bit tests.
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ foo0 (int a, int b, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
foo1 (int a, register int b, ...)
|
foo1 (int a, register int b, ...) // { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
{
|
{
|
||||||
va_list vp;
|
va_list vp;
|
||||||
/* 'b' is declared with register storage, but don't warn
|
/* 'b' is declared with register storage, but don't warn
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ foo0 (int a, int b, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
foo1 (int a, register int b, ...)
|
foo1 (int a, register int b, ...) // { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
{
|
{
|
||||||
va_list vp;
|
va_list vp;
|
||||||
/* 'b' is declared with register storage, but don't warn
|
/* 'b' is declared with register storage, but don't warn
|
||||||
|
|
@ -45,7 +45,7 @@ foo2 (int a, int b, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
foo3 (int a, register int b, ...)
|
foo3 (int a, register int b, ...) // { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
{
|
{
|
||||||
va_list vp;
|
va_list vp;
|
||||||
/* 'b' is declared with register storage, so warn. */
|
/* 'b' is declared with register storage, so warn. */
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,6 @@
|
||||||
|
|
||||||
float vf(int i)
|
float vf(int i)
|
||||||
{
|
{
|
||||||
register vector float a;
|
register vector float a; // { dg-error "ISO C++1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
return a[0];
|
return a[0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,10 @@ typedef int U __attribute__ ((vector_size (16)));
|
||||||
int
|
int
|
||||||
foo (int i)
|
foo (int i)
|
||||||
{
|
{
|
||||||
register U u
|
#if __SSE2__
|
||||||
|
register
|
||||||
|
#endif
|
||||||
|
U u
|
||||||
#if __SSE2__
|
#if __SSE2__
|
||||||
asm ("xmm0")
|
asm ("xmm0")
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1028,12 +1028,12 @@ acceptable. Do NOT use for cryptographic purposes.
|
||||||
|
|
||||||
static hashval_t
|
static hashval_t
|
||||||
iterative_hash (const void *k_in /* the key */,
|
iterative_hash (const void *k_in /* the key */,
|
||||||
register size_t length /* the length of the key */,
|
size_t length /* the length of the key */,
|
||||||
register hashval_t initval /* the previous hash, or
|
hashval_t initval /* the previous hash, or
|
||||||
an arbitrary value */)
|
an arbitrary value */)
|
||||||
{
|
{
|
||||||
register const unsigned char *k = (const unsigned char *)k_in;
|
const unsigned char *k = (const unsigned char *)k_in;
|
||||||
register hashval_t a,b,c,len;
|
hashval_t a,b,c,len;
|
||||||
|
|
||||||
/* Set up the internal state */
|
/* Set up the internal state */
|
||||||
len = length;
|
len = length;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
// P0001R1 - C++17 removal of register keyword
|
||||||
|
// { dg-do compile }
|
||||||
|
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
#define REG1 "ebx"
|
||||||
|
#define REG2 "edi"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REG1
|
||||||
|
register int a __asm (REG1); // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
#endif
|
||||||
|
register int b; // { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
register int c (); // { dg-error "storage class 'register' invalid for function" }
|
||||||
|
int foo (register int d) // { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
{
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
int bar ()
|
||||||
|
{
|
||||||
|
#ifdef REG2
|
||||||
|
register int e __asm (REG2); // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
#else
|
||||||
|
int e;
|
||||||
|
#endif
|
||||||
|
register int f; // { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
e = 6;
|
||||||
|
f = 7;
|
||||||
|
return e + f;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
// P0001R1 - C++17 removal of register keyword
|
||||||
|
// { dg-do compile }
|
||||||
|
// { dg-options "-Wno-register" }
|
||||||
|
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
#define REG1 "ebx"
|
||||||
|
#define REG2 "edi"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REG1
|
||||||
|
register int a __asm (REG1); // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
#endif
|
||||||
|
register int b; // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
register int c (); // { dg-error "storage class 'register' invalid for function" }
|
||||||
|
int foo (register int d) // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
{
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
int bar ()
|
||||||
|
{
|
||||||
|
#ifdef REG2
|
||||||
|
register int e __asm (REG2); // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
#else
|
||||||
|
int e;
|
||||||
|
#endif
|
||||||
|
register int f; // { dg-bogus "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
e = 6;
|
||||||
|
f = 7;
|
||||||
|
return e + f;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
// P0001R1 - C++17 removal of register keyword
|
||||||
|
// { dg-do compile { target c++14_down } }
|
||||||
|
// { dg-options "-Wregister" }
|
||||||
|
|
||||||
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
|
#define REG1 "ebx"
|
||||||
|
#define REG2 "edi"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REG1
|
||||||
|
register int a __asm (REG1); // { dg-bogus "'register' storage class specifier used" }
|
||||||
|
#endif
|
||||||
|
register int b; // { dg-warning "'register' storage class specifier used" }
|
||||||
|
register int c (); // { dg-error "storage class 'register' invalid for function" }
|
||||||
|
int foo (register int d) // { dg-warning "'register' storage class specifier used" }
|
||||||
|
{
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
int bar ()
|
||||||
|
{
|
||||||
|
#ifdef REG2
|
||||||
|
register int e __asm (REG2); // { dg-bogus "'register' storage class specifier used" }
|
||||||
|
#else
|
||||||
|
int e;
|
||||||
|
#endif
|
||||||
|
register int f; // { dg-warning "'register' storage class specifier used" }
|
||||||
|
e = 6;
|
||||||
|
f = 7;
|
||||||
|
return e + f;
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
// PR 29166: r4-r7 corrupted when unwinding.
|
// PR 29166: r4-r7 corrupted when unwinding.
|
||||||
// { dg-do run }
|
// { dg-do run }
|
||||||
|
// { dg-additional-options "-Wno-register" }
|
||||||
|
|
||||||
class Ex
|
class Ex
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
// PR c++/27884
|
// PR c++/27884
|
||||||
|
|
||||||
extern "C" void foo(register int *my_perl);
|
extern "C" void foo(register int *my_perl); // { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ public:
|
||||||
operator int() { return i; }
|
operator int() { return i; }
|
||||||
};
|
};
|
||||||
|
|
||||||
C f (register C x)
|
C f (register C x) // { dg-error "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
{
|
{
|
||||||
return x + 31;
|
return x + 31;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
|
#if __cplusplus > 201402L
|
||||||
|
template <class T> T CoinMax(const T x1, const T x2);
|
||||||
|
template <class T> T CoinMin(const T x1, const T x2);
|
||||||
|
#else
|
||||||
template <class T> T CoinMax(register const T x1, register const T x2);
|
template <class T> T CoinMax(register const T x1, register const T x2);
|
||||||
template <class T> T CoinMin(register const T x1, register const T x2);
|
template <class T> T CoinMin(register const T x1, register const T x2);
|
||||||
|
#endif
|
||||||
class CoinIndexedVector;
|
class CoinIndexedVector;
|
||||||
class ClpModel {
|
class ClpModel {
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
// PR c++/60955
|
// PR c++/60955
|
||||||
// { dg-options "-Wextra" }
|
// { dg-options "-Wextra" }
|
||||||
|
|
||||||
unsigned int erroneous_warning(register int a) {
|
unsigned int erroneous_warning(register int a) { // { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
if ((a) & 0xff) return 1; else return 0;
|
if ((a) & 0xff) return 1; else return 0;
|
||||||
}
|
}
|
||||||
unsigned int no_erroneous_warning(register int a) {
|
unsigned int no_erroneous_warning(register int a) { // { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } }
|
||||||
if (a & 0xff) return 1; else return 0;
|
if (a & 0xff) return 1; else return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,6 @@ void g(int *);
|
||||||
|
|
||||||
void f(void)
|
void f(void)
|
||||||
{
|
{
|
||||||
register int x;
|
register int x; /* { dg-warning "ISO C\\+\\+1z does not allow 'register' storage class specifier" "" { target c++1z } } */
|
||||||
g(&x); /* { dg-warning "address requested for 'x', which is declared 'register'" } */
|
g(&x); /* { dg-warning "address requested for 'x', which is declared 'register'" } */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue