aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/expr.c1
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-parm-7.C17
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-parm-8.C9
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-24.C10
-rw-r--r--gcc/testsuite/g++.dg/warn/Wunused-var-25.C15
8 files changed, 66 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7ff3dc5..73b1cfa 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
2016-04-19 Jason Merrill <jason@redhat.com>
+ PR c++/66543
+ * expr.c (mark_exp_read): Handle NON_DEPENDENT_EXPR.
+ * pt.c (make_pack_expansion): Call mark_exp_read.
+ * semantics.c (finish_id_expression): Call mark_type_use in
+ unevaluated context.
+
DR 2137
* call.c (implicit_conversion): If we choose a copy constructor
for list-initialization from the same type, the conversion is an
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 702b717..61b3953 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -145,6 +145,7 @@ mark_exp_read (tree exp)
case ADDR_EXPR:
case INDIRECT_REF:
case FLOAT_EXPR:
+ case NON_DEPENDENT_EXPR:
mark_exp_read (TREE_OPERAND (exp, 0));
break;
case COMPOUND_EXPR:
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f9a9d99..e18422f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -3696,6 +3696,8 @@ make_pack_expansion (tree arg)
/* Propagate type and const-expression information. */
TREE_TYPE (result) = TREE_TYPE (arg);
TREE_CONSTANT (result) = TREE_CONSTANT (arg);
+ /* Mark this read now, since the expansion might be length 0. */
+ mark_exp_read (arg);
}
else
/* Just use structural equality for these TYPE_PACK_EXPANSIONS;
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 56864b4..85ef993 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -3487,6 +3487,12 @@ finish_id_expression (tree id_expression,
if (!scope && decl != error_mark_node && identifier_p (id_expression))
maybe_note_name_used_in_class (id_expression, decl);
+ /* A use in unevaluated operand might not be instantiated appropriately
+ if tsubst_copy builds a dummy parm, or if we never instantiate a
+ generic lambda, so mark it now. */
+ if (processing_template_decl && cp_unevaluated_operand)
+ mark_type_use (decl);
+
/* Disallow uses of local variables from containing functions, except
within lambda-expressions. */
if (outer_automatic_var_p (decl))
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-7.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-7.C
new file mode 100644
index 0000000..ff1dda5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-7.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-Wunused-but-set-parameter" }
+
+template <typename... Ts> void sink(Ts...);
+
+struct A { int i; };
+
+template <int... I>
+void f(A a)
+{
+ return sink((a.i + I)...);
+}
+
+int main()
+{
+ f<>(A());
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-8.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-8.C
new file mode 100644
index 0000000..867ad6a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-8.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused-but-set-parameter" }
+
+auto l = [](auto t) -> decltype(true ? t : 0) { return {}; };
+
+int main()
+{
+ l(42);
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-24.C b/gcc/testsuite/g++.dg/warn/Wunused-var-24.C
new file mode 100644
index 0000000..924b2db
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-24.C
@@ -0,0 +1,10 @@
+// PR c++/66543
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused-but-set-variable" }
+
+int main() {
+ auto f = []() { };
+ [=](auto) {
+ using Foo = decltype(f());
+ };
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-25.C b/gcc/testsuite/g++.dg/warn/Wunused-var-25.C
new file mode 100644
index 0000000..959e79c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wunused-var-25.C
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++14 } }
+// { dg-options "-Wunused-but-set-variable" }
+
+template <int... I> struct A { };
+template <int... I>
+auto f()
+{
+ constexpr int ar[sizeof...(I)+1] = {I...};
+ return A<ar[I]...>();
+}
+
+int main()
+{
+ f<>();
+}