diff --git a/src/Attr.cc b/src/Attr.cc index 483c98f0ea..dc6ef6e380 100644 --- a/src/Attr.cc +++ b/src/Attr.cc @@ -193,7 +193,7 @@ Attributes::Attributes(std::vector a, AddAttr(std::move(attr)); } -void Attributes::AddAttr(AttrPtr attr) +void Attributes::AddAttr(AttrPtr attr, bool is_redef) { auto acceptable_duplicate_tag = [&](const AttrPtr& attr, const AttrPtr& existing) -> bool { @@ -216,9 +216,12 @@ void Attributes::AddAttr(AttrPtr attr) // Display a warning for duplicated tags on a type. &log tags are intentionally // ignored here because duplicate log tags on record types are valid, and don't // cause any significant breakage for other types. - auto existing = Find(attr->Tag()); - if ( existing && ! acceptable_duplicate_tag(attr, existing) ) - reporter->Error("Duplicate %s tag is ambiguous", attr_name(attr->Tag())); + if ( ! is_redef ) + { + auto existing = Find(attr->Tag()); + if ( existing && ! acceptable_duplicate_tag(attr, existing) ) + reporter->Error("Duplicate %s tag is ambiguous", attr_name(attr->Tag())); + } // We overwrite old attributes by deleting them first. RemoveAttr(attr->Tag()); @@ -249,16 +252,16 @@ void Attributes::AddAttr(AttrPtr attr) } } -void Attributes::AddAttrs(const AttributesPtr& a) +void Attributes::AddAttrs(const AttributesPtr& a, bool is_redef) { for ( const auto& attr : a->GetAttrs() ) - AddAttr(attr); + AddAttr(attr, is_redef); } -void Attributes::AddAttrs(Attributes* a) +void Attributes::AddAttrs(Attributes* a, bool is_redef) { for ( const auto& attr : a->GetAttrs() ) - AddAttr(attr); + AddAttr(attr, is_redef); Unref(a); } diff --git a/src/Attr.h b/src/Attr.h index 5c110bfe7f..51344ffff7 100644 --- a/src/Attr.h +++ b/src/Attr.h @@ -115,12 +115,12 @@ public: ~Attributes() override = default; - void AddAttr(AttrPtr a); + void AddAttr(AttrPtr a, bool is_redef = false); - void AddAttrs(const AttributesPtr& a); + void AddAttrs(const AttributesPtr& a, bool is_redef = false); [[deprecated("Remove in v4.1. Pass IntrusivePtr instead.")]] - void AddAttrs(Attributes* a); // Unref's 'a' when done + void AddAttrs(Attributes* a, bool is_redef = false); // Unref's 'a' when done [[deprecated("Remove in v4.1. Use Find().")]] Attr* FindAttr(AttrTag t) const; diff --git a/src/ID.cc b/src/ID.cc index 46dcd50efd..ab4d34bf9e 100644 --- a/src/ID.cc +++ b/src/ID.cc @@ -314,10 +314,10 @@ std::string ID::GetDeprecationWarning() const return zeek::util::fmt("deprecated (%s): %s", Name(), result.c_str()); } -void ID::AddAttrs(AttributesPtr a) +void ID::AddAttrs(AttributesPtr a, bool is_redef) { if ( attrs ) - attrs->AddAttrs(a); + attrs->AddAttrs(a, is_redef); else attrs = std::move(a); diff --git a/src/ID.h b/src/ID.h index 2ea5a41134..a24724013b 100644 --- a/src/ID.h +++ b/src/ID.h @@ -121,7 +121,7 @@ public: bool IsRedefinable() const; void SetAttrs(AttributesPtr attr); - void AddAttrs(AttributesPtr attr); + void AddAttrs(AttributesPtr attr, bool is_redef = false); void RemoveAttr(AttrTag a); void UpdateValAttrs(); diff --git a/src/Var.cc b/src/Var.cc index 174704e069..b98c89c317 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -213,7 +213,7 @@ static void make_var(const zeek::detail::IDPtr& id, zeek::TypePtr t, id->SetType(t); if ( attr ) - id->AddAttrs(zeek::make_intrusive(std::move(*attr), t, false, id->IsGlobal())); + id->AddAttrs(zeek::make_intrusive(std::move(*attr), t, false, id->IsGlobal()), dt == VAR_REDEF); if ( init ) {