| 712 | } |
| 713 | |
| 714 | Status OpDefAttrDefaultsUnchanged(const OpDef& old_op, const OpDef& new_op) { |
| 715 | AttrMap new_attrs, old_attrs; |
| 716 | FillAttrMap(old_op, &old_attrs); |
| 717 | FillAttrMap(new_op, &new_attrs); |
| 718 | |
| 719 | for (const auto& old_attr : old_op.attr()) { |
| 720 | const OpDef::AttrDef* new_attr = |
| 721 | gtl::FindPtrOrNull(new_attrs, old_attr.name()); |
| 722 | if (new_attr == nullptr) continue; |
| 723 | if (old_attr.has_default_value() != new_attr->has_default_value()) { |
| 724 | return errors::InvalidArgument( |
| 725 | "Attr '", old_attr.name(), "' has added/removed it's default; ", |
| 726 | "from ", DefaultAttrStr(old_attr), " to ", DefaultAttrStr(*new_attr)); |
| 727 | } |
| 728 | if (old_attr.has_default_value() && |
| 729 | !AreAttrValuesEqual(old_attr.default_value(), |
| 730 | new_attr->default_value())) { |
| 731 | return errors::InvalidArgument( |
| 732 | "Attr '", old_attr.name(), "' has changed it's default value; ", |
| 733 | "from ", DefaultAttrStr(old_attr), " to ", DefaultAttrStr(*new_attr)); |
| 734 | } |
| 735 | } |
| 736 | |
| 737 | return Status::OK(); |
| 738 | } |
| 739 | |
| 740 | void RemoveNonDeprecationDescriptionsFromOpDef(OpDef* op_def) { |
| 741 | for (int i = 0; i < op_def->input_arg_size(); ++i) { |