diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-12-18 17:53:55 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-12-18 17:53:55 +0000 |
commit | 6e4992ca7811bcb1d3ebe587d06e346c09d72cc1 (patch) | |
tree | 7e294e7ddc4eda46df7d1533f7a367674c178de6 /gcc | |
parent | fbe575b652f5bdcc459f447a0e6f0e059996d4ef (diff) | |
download | gcc-6e4992ca7811bcb1d3ebe587d06e346c09d72cc1.zip gcc-6e4992ca7811bcb1d3ebe587d06e346c09d72cc1.tar.gz gcc-6e4992ca7811bcb1d3ebe587d06e346c09d72cc1.tar.bz2 |
re PR c++/60955 (Erroneous warning about taking address of register with std=c++1y)
/cp
2014-12-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60955
* pt.c (struct warning_sentinel): Move it...
* cp-tree.h: ... here.
* semantics.c (force_paren_expr): Use it.
/testsuite
2014-12-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60955
* g++.dg/warn/register-parm-1.C: New.
From-SVN: r218871
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 12 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/register-parm-1.C | 9 |
6 files changed, 36 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e7e2365..e22b516 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-12-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/60955 + * pt.c (struct warning_sentinel): Move it... + * cp-tree.h: ... here. + * semantics.c (force_paren_expr): Use it. + 2014-12-17 Jason Merrill <jason@redhat.com> PR c++/64333 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index e0e7690..9487e50 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1149,6 +1149,18 @@ struct processing_template_decl_sentinel } }; +/* RAII sentinel to disable certain warnings during template substitution + and elsewhere. */ + +struct warning_sentinel +{ + int &flag; + int val; + warning_sentinel(int& flag, bool suppress=true) + : flag(flag), val(flag) { if (suppress) flag = 0; } + ~warning_sentinel() { flag = val; } +}; + /* The cached class binding level, from the most recently exited class, or NULL if none. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8a663d9..9f03684 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14438,16 +14438,6 @@ tsubst_non_call_postfix_expression (tree t, tree args, return t; } -/* Sentinel to disable certain warnings during template substitution. */ - -struct warning_sentinel { - int &flag; - int val; - warning_sentinel(int& flag, bool suppress=true) - : flag(flag), val(flag) { if (suppress) flag = 0; } - ~warning_sentinel() { flag = val; } -}; - /* Like tsubst but deals with expressions and performs semantic analysis. FUNCTION_P is true if T is the "F" in "F (ARGS)". */ diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 5ad391e..bea3b1f 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1660,6 +1660,9 @@ force_paren_expr (tree expr) tree type = unlowered_expr_type (expr); bool rval = !!(kind & clk_rvalueref); type = cp_build_reference_type (type, rval); + /* This inhibits warnings in, eg, cxx_mark_addressable + (c++/60955). */ + warning_sentinel s (extra_warnings); expr = build_static_cast (type, expr, tf_error); if (expr != error_mark_node) REF_PARENTHESIZED_P (expr) = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4d75d0e..5ad3d9ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-18 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/60955 + * g++.dg/warn/register-parm-1.C: New. + 2014-12-18 H.J. Lu <hongjiu.lu@intel.com> * gcc.target/i386/amd64-abi-7.c: New tests. diff --git a/gcc/testsuite/g++.dg/warn/register-parm-1.C b/gcc/testsuite/g++.dg/warn/register-parm-1.C new file mode 100644 index 0000000..44232d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/register-parm-1.C @@ -0,0 +1,9 @@ +// PR c++/60955 +// { dg-options "-Wextra" } + +unsigned int erroneous_warning(register int a) { + if ((a) & 0xff) return 1; else return 0; +} +unsigned int no_erroneous_warning(register int a) { + if (a & 0xff) return 1; else return 0; +} |