rsmith added a comment. In https://reviews.llvm.org/D46190#1082616, @CarlosAlbertoEnciso wrote:
> My initial approach was based on the following test case: > > void Bar() { > typedef int I_Ref; > I_Ref var_bar; > } > > void Foo() { > typedef int I_Used; > I_Used var_foo; > var_foo = 2; > } > > void Test() { > Foo(); > } > [...] > The typedef 'I_Ref' is marked as 'referenced' due to its association with > 'var_bar'. > The typedef 'I_Used' is marked as 'referenced' despite that its association > with 'var_foo' which is 'used' > Both 'typedefs' are marked as 'referenced'. This is already the correct outcome. Both typedefs are referenced; this is correct because they are named by the source code. Neither typedef is marked as "used"; this is correct because a typedef cannot be odr-used. Let's look at your original example again (I've cleaned it up and extended it a bit, but hopefully this matches your intent): namespace nsp { int var1, var2; } using nsp::var1; using nsp::var2; void bar() { nsp::var1 = 1; var2 = 1; } Now, what should happen here is: - The use of `nsp::var1` in `bar` marks `nsp::var1` as referenced (because it was named), and marks `nsp::var1` as used (because it was odr-used by the assignment). The `UsingShadowDecl` for `::var1` is not marked as referenced (nor used), so we emit an unused-using-declaration warning. - The use of `var2` in `bar` marks `::var2` as referenced (because it was named), and marks `nsp::var2` as used (because it was odr-used by the assignment). The `UsingShadowDecl` for `::var2` is marked as referenced, so we do not warn on it. Repository: rC Clang https://reviews.llvm.org/D46190 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits