From 70065631a783f85f98bdc20f992b811136633af2 Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Sat, 27 Sep 2025 22:20:10 -0700 Subject: [PATCH] revised fix --- src/Var.cc | 15 +++++++++++---- .../redeclaration-redefinition-errors.zeek | 8 ++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Var.cc b/src/Var.cc index 14e108c31b..1d2a929d3e 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -351,21 +351,28 @@ void add_type(ID* id, TypePtr t, std::unique_ptr> attr) { if ( const auto& old_t = id->GetType() ) { // The identifier already has a type associated with it. This can // be okay if (1) it's already been marked as a Type identifier, - // (2) the previous type is a stub. + // (2) (2) the previous type is a stub, or an equivalent enum. if ( ! id->IsType() ) { reporter->Error("Identifier %s has already been declared and is not a type", id->Name()); return; } - if ( old_t->Tag() == t->Tag() && - ((old_t->Tag() == TYPE_RECORD && old_t->AsRecordType()->NumFields() == 0) || t->Tag() == TYPE_ENUM) ) + if ( old_t->Tag() == t->Tag() && ((old_t->Tag() == TYPE_RECORD && old_t->AsRecordType()->NumFields() == 0) || + (t->Tag() == TYPE_ENUM && same_type(t, old_t))) ) // It has a consistent tag and is either redeclaring a stub // record (used in init-bare.zeek) or an enum (which can // appear due to specifiers in BiFs, for example). ; else { - reporter->Error("Type %s has already been declared", id->Name()); + std::string loc; + auto li = id->GetLocationInfo(); + auto fn = li->FileName(); + int ln = li->FirstLine(); + if ( fn && fn[0] != '\0' ) + loc = " at " + std::string(fn) + ":" + std::to_string(ln); + + reporter->Error("Type %s has already been declared%s", id->Name(), loc.c_str()); return; } } diff --git a/testing/btest/language/redeclaration-redefinition-errors.zeek b/testing/btest/language/redeclaration-redefinition-errors.zeek index 5c44f2b9d6..0efb0d7341 100644 --- a/testing/btest/language/redeclaration-redefinition-errors.zeek +++ b/testing/btest/language/redeclaration-redefinition-errors.zeek @@ -59,3 +59,11 @@ global f: function(); global f = function() { }; global f: hook(); global f: event(); + +# @TEST-START-NEXT +global f = function() { }; +type f: bool; + +# @TEST-START-NEXT +type f: record {}; +type f: bool;