Hi,
On 12/18/2014 03:20 PM, Jason Merrill wrote:
On 12/18/2014 06:17 AM, Paolo Carlini wrote:
Sure. The below uses the c_inhibit_evaluation_warnings mechanism and
passes testing. I wondered if in such cases we could alternately use the
warning_sentinel mechanism (moved to cp-tree.h of course) ?
That would make sense to me.
Good. Then I'm finishing testing the below.
Thanks,
Paolo.
////////////////////
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h (revision 218857)
+++ 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 218857)
+++ 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 218857)
+++ cp/semantics.c (working copy)
@@ -1660,6 +1660,7 @@ force_paren_expr (tree expr)
tree type = unlowered_expr_type (expr);
bool rval = !!(kind & clk_rvalueref);
type = cp_build_reference_type (type, rval);
+ 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;
+}