Message ID | 51B89A91.2010204@oracle.com |
---|---|
State | New |
Headers | show |
On 06/12/2013 11:58 AM, Paolo Carlini wrote: > - && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE > + && TREE_CODE (type) != REFERENCE_TYPE This change is wrong; we specifically want to suppress the unused-but-set warning for reference variables. Drop it and the patch is OK. Jason
Hi, Jason Merrill <jason@redhat.com> ha scritto: >On 06/12/2013 11:58 AM, Paolo Carlini wrote: >> - && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE >> + && TREE_CODE (type) != REFERENCE_TYPE > >This change is wrong; we specifically want to suppress the >unused-but-set warning for reference variables. Drop it and the patch >is OK. I understand the general issue, but I'm not sure we can't use 'type' here: we don't even consider emitting the unused-but-set warning when TREE_USED (decl) is false and in this case I don't call non_reference at the outset. I think ;) Paolo
Humpf, >I understand the general issue, but I'm not sure we can't use 'type' >here: we don't even consider emitting the unused-but-set warning when >TREE_USED (decl) is false and in this case I don't call non_reference >at the outset. I meant *only* in this case I call non_reference, you see my point. Rewording: as the one line comment says, I only call non_reference at the outset when I know that either we'll end up producing the normal unused-variable warning or nothing at all. Paolo
On 06/12/2013 01:37 PM, Paolo Carlini wrote:
> Rewording: as the one line comment says, I only call non_reference at the outset when I know that either we'll end up producing the normal unused-variable warning or nothing at all.
Oh, I see. But that's a rather subtle difference; better to have 'type'
mean something consistent and leave the unused-but-set code checking
TREE_TYPE (decl).
Jason
Index: cp/decl.c =================================================================== --- cp/decl.c (revision 200012) +++ cp/decl.c (working copy) @@ -622,18 +622,22 @@ 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; + tree type = TREE_TYPE (decl); + if (VAR_P (decl) && ! TREE_USED (decl)) + // For -Wunused-variable see through references (PR 38958). + type = non_reference (type); 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 - && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE + && TREE_CODE (type) != REFERENCE_TYPE && errorcount == unused_but_set_errorcount) { warning (OPT_Wunused_but_set_variable, Index: testsuite/g++.dg/warn/Wunused-var-20.C =================================================================== --- testsuite/g++.dg/warn/Wunused-var-20.C (revision 0) +++ testsuite/g++.dg/warn/Wunused-var-20.C (working copy) @@ -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; +}