aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-05-23 21:46:16 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-05-23 21:46:16 -0400
commit5726acd7d7f84a27e17719f185e3e4c5e67aeb2d (patch)
treeb840b09fa0605e400acc0557650e104335dfb670 /gcc
parentc15394ee0dd5f7bcc4ee8d1ce91d2ce98d04f2d9 (diff)
downloadgcc-5726acd7d7f84a27e17719f185e3e4c5e67aeb2d.zip
gcc-5726acd7d7f84a27e17719f185e3e4c5e67aeb2d.tar.gz
gcc-5726acd7d7f84a27e17719f185e3e4c5e67aeb2d.tar.bz2
-Wunused and C++17 structured bindings
* decl.c (poplevel): Don't warn about unused structured bindings, only real variables. * error.c (dump_simple_decl): Handle structured bindings. * expr.c (mark_exp_read): Look through DECL_VALUE_EXPR. From-SVN: r248399
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/cp/error.c2
-rw-r--r--gcc/cp/expr.c3
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/decomp29.C26
5 files changed, 43 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4a72b65..785dfc5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2017-05-23 Jason Merrill <jason@redhat.com>
+
+ -Wunused and C++17 structured bindings
+ * decl.c (poplevel): Don't warn about unused structured bindings,
+ only real variables.
+ * error.c (dump_simple_decl): Handle structured bindings.
+ * expr.c (mark_exp_read): Look through DECL_VALUE_EXPR.
+
2017-05-23 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (PUSH_GLOBAL, PUSH_LOCAL, PUSH_USING): Delete.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5877f37..afd47bb 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -656,7 +656,10 @@ poplevel (int keep, int reverse, int functionbody)
if (VAR_P (decl)
&& (! TREE_USED (decl) || !DECL_READ_P (decl))
&& ! DECL_IN_SYSTEM_HEADER (decl)
- && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl)
+ /* For structured bindings, consider only real variables, not
+ subobjects. */
+ && (DECL_DECOMPOSITION_P (decl) ? !DECL_VALUE_EXPR (decl)
+ : (DECL_NAME (decl) && !DECL_ARTIFICIAL (decl)))
&& type != error_mark_node
&& (!CLASS_TYPE_P (type)
|| !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 1ae25bb..624a0e9 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -992,6 +992,8 @@ dump_simple_decl (cxx_pretty_printer *pp, tree t, tree type, int flags)
else
dump_decl (pp, DECL_NAME (t), flags);
}
+ else if (DECL_DECOMPOSITION_P (t))
+ pp_string (pp, M_("<structured bindings>"));
else
pp_string (pp, M_("<anonymous>"));
if (flags & TFF_DECL_SPECIFIERS)
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 77af54e..75e99e5 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -133,6 +133,9 @@ mark_exp_read (tree exp)
switch (TREE_CODE (exp))
{
case VAR_DECL:
+ if (DECL_VALUE_EXPR (exp))
+ mark_exp_read (DECL_VALUE_EXPR (exp));
+ gcc_fallthrough ();
case PARM_DECL:
DECL_READ_P (exp) = 1;
break;
diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp29.C b/gcc/testsuite/g++.dg/cpp1z/decomp29.C
new file mode 100644
index 0000000..daf07a0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/decomp29.C
@@ -0,0 +1,26 @@
+// { dg-options "-std=c++17 -Wunused" }
+
+#include <tuple>
+
+struct A { int i,j,k; };
+
+A f();
+
+int z;
+
+int main()
+{
+ {
+ auto [i,j,k] = f(); // { dg-warning "unused" }
+ }
+ {
+ auto [i,j,k] = f();
+ z = i;
+ }
+ {
+ auto [i,j] = std::tuple{1,2}; // { dg-warning "unused" }
+ }
+ // No parallel second test, because in this case i and j are variables rather
+ // than mere bindings, so there isn't a link between them and using i will
+ // not prevent a warning about unused j.
+}