diff options
author | Richard Trieu <rtrieu@google.com> | 2013-09-16 20:46:50 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2013-09-16 20:46:50 +0000 |
commit | fd68777c7b241d278c37abb25f0db4c29701a9e9 (patch) | |
tree | 62178e8956961db55ab3dad6b9cb63c41effb4d6 /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 81e3294e7e19387ad05b60adcd50617b61d94d43 (diff) | |
download | bcm5719-llvm-fd68777c7b241d278c37abb25f0db4c29701a9e9.tar.gz bcm5719-llvm-fd68777c7b241d278c37abb25f0db4c29701a9e9.zip |
Pass additional information around the uninitialized field visitor.
llvm-svn: 190805
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c45548d3a84..d9279533b43 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/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<EnumConstantDecl>(ME->getMemberDecl())) return; @@ -2107,8 +2110,11 @@ namespace { Base = ME->getBase(); } - if (VD == FieldME->getMemberDecl() && isa<CXXThisExpr>(Base)) { - unsigned diag = VD->getType()->isReferenceType() + if (!isa<CXXThisExpr>(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<MemberExpr>(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<ImplicitCastExpr>(E->getArg(0))) if (ICE->getCastKind() == CK_NoOp) if (MemberExpr *ME = dyn_cast<MemberExpr>(ICE->getSubExpr())) - HandleMemberExpr(ME); + HandleMemberExpr(ME, false /*CheckReferenceOnly*/); Inherited::VisitCXXConstructExpr(E); } |