From: Richard Trieu Date: Mon, 16 Sep 2013 20:46:50 +0000 (+0000) Subject: Pass additional information around the uninitialized field visitor. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ddec88be4a322adeb9990db2f83abaca6579d5f;p=clang Pass additional information around the uninitialized field visitor. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190805 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index c45548d3a8..d9279533b4 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2085,7 +2085,10 @@ namespace { isReferenceType = this->VD->getType()->isReferenceType(); } - void HandleMemberExpr(MemberExpr *ME) { + void HandleMemberExpr(MemberExpr *ME, bool CheckReferenceOnly) { + if (CheckReferenceOnly && !isReferenceType) + return; + if (isa(ME->getMemberDecl())) return; @@ -2107,8 +2110,11 @@ namespace { Base = ME->getBase(); } - if (VD == FieldME->getMemberDecl() && isa(Base)) { - unsigned diag = VD->getType()->isReferenceType() + if (!isa(Base)) + return; + + if (VD == FieldME->getMemberDecl()) { + unsigned diag = isReferenceType ? diag::warn_reference_field_is_uninit : diag::warn_field_is_uninit; S.Diag(FieldME->getExprLoc(), diag) << VD; @@ -2119,7 +2125,7 @@ namespace { E = E->IgnoreParens(); if (MemberExpr *ME = dyn_cast(E)) { - HandleMemberExpr(ME); + HandleMemberExpr(ME, false /*CheckReferenceOnly*/); return; } @@ -2152,8 +2158,7 @@ namespace { } void VisitMemberExpr(MemberExpr *ME) { - if (isReferenceType) - HandleMemberExpr(ME); + HandleMemberExpr(ME, true /*CheckReferenceOnly*/); Inherited::VisitMemberExpr(ME); } @@ -2170,7 +2175,7 @@ namespace { if (ImplicitCastExpr* ICE = dyn_cast(E->getArg(0))) if (ICE->getCastKind() == CK_NoOp) if (MemberExpr *ME = dyn_cast(ICE->getSubExpr())) - HandleMemberExpr(ME); + HandleMemberExpr(ME, false /*CheckReferenceOnly*/); Inherited::VisitCXXConstructExpr(E); }