Fix spurious warnings about unused private field

If the address of a field is taken as a pointer to member, we should
not warn that the field is not used.

Normaly, yse of fields are done from MemberExpr, but in case of pointer to
member, it is in a DeclRefExpr

Differential Revision: http://reviews.llvm.org/D20054

llvm-svn: 268895
This commit is contained in:
Olivier Goffart 2016-05-09 07:09:51 +00:00
parent 5af2c005eb
commit 63a2083be9
2 changed files with 8 additions and 4 deletions

View File

@ -1736,10 +1736,12 @@ Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK,
!Diags.isIgnored(diag::warn_arc_repeated_use_of_weak, E->getLocStart()))
recordUseOfEvaluatedWeak(E);
// Just in case we're building an illegal pointer-to-member.
FieldDecl *FD = dyn_cast<FieldDecl>(D);
if (FD && FD->isBitField())
E->setObjectKind(OK_BitField);
if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
UnusedPrivateFields.remove(FD);
// Just in case we're building an illegal pointer-to-member.
if (FD->isBitField())
E->setObjectKind(OK_BitField);
}
return E;
}

View File

@ -128,6 +128,7 @@ class EverythingUsed {
int *use = &by_reference_;
int test[2];
test[as_array_index_] = 42;
int EverythingUsed::*ptr = &EverythingUsed::by_pointer_to_member_;
}
template<class T>
@ -142,6 +143,7 @@ class EverythingUsed {
int by_template_function_;
int as_array_index_;
int by_initializer_;
int by_pointer_to_member_;
};
class HasFeatureTest {