summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2013-09-16 20:46:50 +0000
committerRichard Trieu <rtrieu@google.com>2013-09-16 20:46:50 +0000
commitfd68777c7b241d278c37abb25f0db4c29701a9e9 (patch)
tree62178e8956961db55ab3dad6b9cb63c41effb4d6 /clang/lib/Sema/SemaDeclCXX.cpp
parent81e3294e7e19387ad05b60adcd50617b61d94d43 (diff)
downloadbcm5719-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.cpp19
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);
}
OpenPOWER on IntegriCloud