From 6a0263647ee6694086e4dec1ee67094a31df10d9 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Wed, 12 Jun 2013 21:36:36 +0000 Subject: [PATCH] re PR c++/38958 ('unused variable' warning emitted when extending the lifetime of a returned RAII type by holding a reference to const despite delayed destructor side-effects. [dtor]) /cp 2013-06-12 Paolo Carlini PR c++/38958 * decl.c (poplevel): For the benefit of -Wunused-variable see through references. /testsuite 2013-06-12 Paolo Carlini PR c++/38958 * g++.dg/warn/Wunused-var-20.C: New. From-SVN: r200042 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 9 ++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/warn/Wunused-var-20.C | 19 +++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wunused-var-20.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2c93982..48a9310 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2013-06-12 Paolo Carlini + PR c++/38958 + * decl.c (poplevel): For the benefit of -Wunused-variable see + through references. + +2013-06-12 Paolo Carlini + * parser.c (cp_parser_nested_name_specifier_opt): Fix typo in comment. 2013-06-12 Paolo Carlini diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7825c73..9eb1d12 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -622,17 +622,20 @@ poplevel (int keep, int reverse, int functionbody) push_local_binding where the list of decls returned by getdecls is built. */ decl = TREE_CODE (d) == TREE_LIST ? TREE_VALUE (d) : d; + // See through references for improved -Wunused-variable (PR 38958). + tree type = non_reference (TREE_TYPE (decl)); if (VAR_P (decl) && (! TREE_USED (decl) || !DECL_READ_P (decl)) && ! DECL_IN_SYSTEM_HEADER (decl) && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl) - && TREE_TYPE (decl) != error_mark_node - && (!CLASS_TYPE_P (TREE_TYPE (decl)) - || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))) + && type != error_mark_node + && (!CLASS_TYPE_P (type) + || !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))) { if (! TREE_USED (decl)) warning (OPT_Wunused_variable, "unused variable %q+D", decl); else if (DECL_CONTEXT (decl) == current_function_decl + // For -Wunused-but-set-variable leave references alone. && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE && errorcount == unused_but_set_errorcount) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 51143cb..b167e4c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-12 Paolo Carlini + + PR c++/38958 + * g++.dg/warn/Wunused-var-20.C: New. + 2013-06-12 Richard Sandiford * gcc.target/mips/mips.exp: Handle -f{no-,}common. diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-20.C b/gcc/testsuite/g++.dg/warn/Wunused-var-20.C new file mode 100644 index 0000000..792c253 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-20.C @@ -0,0 +1,19 @@ +// PR c++/38958 +// { dg-options "-Wunused" } + +volatile int g; + +struct Lock +{ + ~Lock() { g = 0; } +}; + +Lock AcquireLock() { return Lock(); } + +int main() +{ + const Lock& lock = AcquireLock(); + g = 1; + g = 2; + g = 3; +} -- 2.7.4