bool CheckFinalizerVisitor::VisitMemberExpr(MemberExpr* member) { FieldDecl* field = dyn_cast<FieldDecl>(member->getMemberDecl()); if (!field) return true; RecordInfo* info = cache_->Lookup(field->getParent()); if (!info) return true; RecordInfo::Fields::iterator it = info->GetFields().find(field); if (it == info->GetFields().end()) return true; if (seen_members_.find(member) != seen_members_.end()) return true; bool as_eagerly_finalized = false; if (blacklist_context_ && MightBeCollected(&it->second, &as_eagerly_finalized)) { finalized_fields_.push_back( Error(member, as_eagerly_finalized, &it->second)); seen_members_.insert(member); } return true; }
bool ATSCollectionVisitor::VisitMemberExpr(MemberExpr *ME) { ValueDecl *OrigDecl = ME->getMemberDecl(); FieldDecl *FD = dyn_cast<FieldDecl>(OrigDecl); if (!FD) { // in C++, getMemberDecl returns a CXXMethodDecl. if (TransformationManager::isCXXLangOpt()) return true; TransAssert(0 && "Bad FD!\n"); } const Type *T = FD->getType().getTypePtr(); if (!T->isScalarType()) return true; RecordDecl *RD = FD->getParent(); TransAssert(RD && "NULL RecordDecl!"); if (!RD->isStruct() && !RD->isUnion()) return true; ConsumerInstance->addOneExpr(ME); return true; }
void BlinkGCPluginConsumer::NotePartObjectContainsGCRoot(FieldPoint* point) { FieldDecl* field = point->field(); ReportDiagnostic(field->getLocStart(), diag_part_object_contains_gc_root_note_) << field << field->getParent(); }