bool RecordInfo::IsOnlyPlacementNewable() { if (is_only_placement_newable_ == kNotComputed) { bool placement = false; bool new_deleted = false; for (CXXRecordDecl::method_iterator it = record_->method_begin(); it != record_->method_end(); ++it) { if (it->getNameAsString() == kNewOperatorName) { if (it->getNumParams() == 1) { new_deleted = it->isDeleted(); } else if (it->getNumParams() == 2) { placement = !it->isDeleted(); } } } is_only_placement_newable_ = (placement && new_deleted) ? kTrue : kFalse; } return is_only_placement_newable_; }
bool RecordInfo::IsNonNewable() { if (is_non_newable_ == kNotComputed) { bool deleted = false; bool all_deleted = true; for (CXXRecordDecl::method_iterator it = record_->method_begin(); it != record_->method_end(); ++it) { if (it->getNameAsString() == kNewOperatorName) { deleted = it->isDeleted(); all_deleted = all_deleted && deleted; } } is_non_newable_ = (deleted && all_deleted) ? kTrue : kFalse; } return is_non_newable_; }
bool RecordInfo::IsStackAllocated() { if (is_stack_allocated_ == kNotComputed) { is_stack_allocated_ = kFalse; for (Bases::iterator it = GetBases().begin(); it != GetBases().end(); ++it) { if (it->second.info()->IsStackAllocated()) { is_stack_allocated_ = kTrue; return is_stack_allocated_; } } for (CXXRecordDecl::method_iterator it = record_->method_begin(); it != record_->method_end(); ++it) { if (it->getNameAsString() == kNewOperatorName && it->isDeleted() && Config::IsStackAnnotated(*it)) { is_stack_allocated_ = kTrue; return is_stack_allocated_; } } } return is_stack_allocated_; }