Pass additional information around the uninitialized field visitor.

llvm-svn: 190805
This commit is contained in:
Richard Trieu 2013-09-16 20:46:50 +00:00
parent 81e3294e7e
commit fd68777c7b
1 changed files with 12 additions and 7 deletions

View File

@ -2085,7 +2085,10 @@ namespace {
isReferenceType = this->VD->getType()->isReferenceType(); isReferenceType = this->VD->getType()->isReferenceType();
} }
void HandleMemberExpr(MemberExpr *ME) { void HandleMemberExpr(MemberExpr *ME, bool CheckReferenceOnly) {
if (CheckReferenceOnly && !isReferenceType)
return;
if (isa<EnumConstantDecl>(ME->getMemberDecl())) if (isa<EnumConstantDecl>(ME->getMemberDecl()))
return; return;
@ -2107,8 +2110,11 @@ namespace {
Base = ME->getBase(); Base = ME->getBase();
} }
if (VD == FieldME->getMemberDecl() && isa<CXXThisExpr>(Base)) { if (!isa<CXXThisExpr>(Base))
unsigned diag = VD->getType()->isReferenceType() return;
if (VD == FieldME->getMemberDecl()) {
unsigned diag = isReferenceType
? diag::warn_reference_field_is_uninit ? diag::warn_reference_field_is_uninit
: diag::warn_field_is_uninit; : diag::warn_field_is_uninit;
S.Diag(FieldME->getExprLoc(), diag) << VD; S.Diag(FieldME->getExprLoc(), diag) << VD;
@ -2119,7 +2125,7 @@ namespace {
E = E->IgnoreParens(); E = E->IgnoreParens();
if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) { if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
HandleMemberExpr(ME); HandleMemberExpr(ME, false /*CheckReferenceOnly*/);
return; return;
} }
@ -2152,8 +2158,7 @@ namespace {
} }
void VisitMemberExpr(MemberExpr *ME) { void VisitMemberExpr(MemberExpr *ME) {
if (isReferenceType) HandleMemberExpr(ME, true /*CheckReferenceOnly*/);
HandleMemberExpr(ME);
Inherited::VisitMemberExpr(ME); Inherited::VisitMemberExpr(ME);
} }
@ -2170,7 +2175,7 @@ namespace {
if (ImplicitCastExpr* ICE = dyn_cast<ImplicitCastExpr>(E->getArg(0))) if (ImplicitCastExpr* ICE = dyn_cast<ImplicitCastExpr>(E->getArg(0)))
if (ICE->getCastKind() == CK_NoOp) if (ICE->getCastKind() == CK_NoOp)
if (MemberExpr *ME = dyn_cast<MemberExpr>(ICE->getSubExpr())) if (MemberExpr *ME = dyn_cast<MemberExpr>(ICE->getSubExpr()))
HandleMemberExpr(ME); HandleMemberExpr(ME, false /*CheckReferenceOnly*/);
Inherited::VisitCXXConstructExpr(E); Inherited::VisitCXXConstructExpr(E);
} }