diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/expr.c | 1 | ||||
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-parm-7.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-parm-8.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-var-24.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wunused-var-25.C | 15 |
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<>(); +} |