diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-04-01 17:10:51 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-04-01 17:12:05 +1300 |
commit | 1cc0269f75b8b2dd979c01ef4a500a09a0cc4354 (patch) | |
tree | 4b7f500844ef93848c2430019c4ec761d7e07c39 /src/processors/resolver.rs | |
parent | 5253be190b1cac16fe4f8658491959e15e52f1b3 (diff) | |
download | assembler-1cc0269f75b8b2dd979c01ef4a500a09a0cc4354.zip |
Fix resolver error
To check if a particular definition was defining a particular symbol,
the names of the definition and reference were being compared, when the
namespace-aware Symbol::defines method should have been used instead.
This was causing an issue where a namespaced definition would be marked
as resolving a with the same name in a different namespace. This was
resulting in a very complicated and incorrect cyclic dependency error.
Diffstat (limited to 'src/processors/resolver.rs')
-rw-r--r-- | src/processors/resolver.rs | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/processors/resolver.rs b/src/processors/resolver.rs index 969b817..b4bcc80 100644 --- a/src/processors/resolver.rs +++ b/src/processors/resolver.rs @@ -187,7 +187,7 @@ impl Resolver { for symbol in symbols { if let SymbolRole::Definition(_) = symbol.role { for unresolved in &self.unresolved { - if unresolved.symbol.name == symbol.name { + if symbol.defines(&unresolved.symbol) { return Some(unresolved.source_id); } } @@ -206,7 +206,7 @@ impl Resolver { } // Populate the .parent_ids field of every source unit. for reference in &self.resolved { - let predicate = |d: &&TrackedDefinition| d.tracked.symbol.name == reference.tracked.symbol.name; + let predicate = |d: &&TrackedDefinition| d.tracked.symbol.defines(&reference.tracked.symbol); if let Some(definition) = self.definitions.iter().find(predicate) { // A unit cannot be its own parent. let is_self = reference.tracked.source_id == definition.tracked.source_id; |