aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-12-18 17:53:55 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-12-18 17:53:55 +0000
commit6e4992ca7811bcb1d3ebe587d06e346c09d72cc1 (patch)
tree7e294e7ddc4eda46df7d1533f7a367674c178de6
parentfbe575b652f5bdcc459f447a0e6f0e059996d4ef (diff)
downloadgcc-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
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-tree.h12
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/cp/semantics.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/register-parm-1.C9
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;
+}