]> granicus.if.org Git - clang/commitdiff
Pass additional information around the uninitialized field visitor.
authorRichard Trieu <rtrieu@google.com>
Mon, 16 Sep 2013 20:46:50 +0000 (20:46 +0000)
committerRichard Trieu <rtrieu@google.com>
Mon, 16 Sep 2013 20:46:50 +0000 (20:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190805 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp

index c45548d3a8442648445ed5c458c40be7fbdbc734..d9279533b43ef59d5733afdb1ec5ab3064a114e9 100644 (file)
@@ -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);
     }