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
This commit is contained in:
Paolo Carlini 2014-12-18 17:53:55 +00:00 committed by Paolo Carlini
parent fbe575b652
commit 6e4992ca78
6 changed files with 36 additions and 10 deletions

View File

@ -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

View File

@ -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. */

View File

@ -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)". */

View File

@ -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;

View File

@ -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.

View File

@ -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;
}