Hi,
On 12/18/2014 06:21 PM, Jason Merrill wrote:
On 12/18/2014 11:31 AM, Paolo Carlini wrote:
+ warning_sentinel s (extra_warnings);
Let's add a comment about which warning we're avoiding here. OK with
that change.
Thanks. I'm attaching what I just committed. This is a regression, I
suppose the patch is ok for 4_9-branch too, right?
Thanks,
Paolo.
/////////////
/cp
2014-12-18 Paolo Carlini <paolo.carl...@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.carl...@oracle.com>
PR c++/60955
* g++.dg/warn/register-parm-1.C: New.
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h (revision 218870)
+++ cp/cp-tree.h (working copy)
@@ -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. */
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 218870)
+++ cp/pt.c (working copy)
@@ -14438,16 +14438,6 @@ tsubst_non_call_postfix_expression (tree t, tree a
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)". */
Index: cp/semantics.c
===================================================================
--- cp/semantics.c (revision 218870)
+++ cp/semantics.c (working copy)
@@ -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;
Index: testsuite/g++.dg/warn/register-parm-1.C
===================================================================
--- testsuite/g++.dg/warn/register-parm-1.C (revision 0)
+++ testsuite/g++.dg/warn/register-parm-1.C (working copy)
@@ -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;
+}