Skip to content

Commit 068068a

Browse files
committed
Ensure disambiguated overloaded name has reference set
1 parent c5a47da commit 068068a

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

vhdl_lang/src/analysis/names.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,8 @@ impl<'a> AnalyzeContext<'a> {
319319
fn name_to_type(
320320
&self,
321321
pos: &SrcPos,
322+
// Reference to set if overloaded name was disambiguated
323+
reference: Option<&mut Reference>,
322324
name: ResolvedName<'a>,
323325
) -> Result<Option<DisambiguatedType<'a>>, Diagnostic> {
324326
match name {
@@ -344,6 +346,11 @@ impl<'a> AnalyzeContext<'a> {
344346
},
345347
ResolvedName::Overloaded(des, overloaded) => {
346348
if let Some(disamb) = self.disambiguate_no_actuals(&des, None, &overloaded)? {
349+
if let Disambiguated::Unambiguous(ref ent) = disamb {
350+
if let Some(reference) = reference {
351+
*reference = Some(ent.id());
352+
}
353+
}
347354
Ok(Some(disamb.into_type()))
348355
} else {
349356
Ok(None)
@@ -1157,7 +1164,7 @@ impl<'a> AnalyzeContext<'a> {
11571164
) -> EvalResult<DisambiguatedType<'a>> {
11581165
let resolved =
11591166
self.name_resolve_with_suffixes(scope, expr_pos, name, None, false, diagnostics)?;
1160-
match self.name_to_type(expr_pos, resolved) {
1167+
match self.name_to_type(expr_pos, name.suffix_reference_mut(), resolved) {
11611168
Ok(Some(typ)) => Ok(typ),
11621169
Ok(None) => Err(EvalError::Unknown),
11631170
Err(diag) => {

vhdl_lang/src/analysis/tests/typecheck_expression.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,6 +1277,26 @@ end;
12771277
);
12781278
}
12791279

1280+
#[test]
1281+
fn resolves_unambiguous_boolean_reference() {
1282+
let mut builder = LibraryBuilder::new();
1283+
let code = builder.in_declarative_region(
1284+
"
1285+
procedure wrapper is
1286+
begin
1287+
assert true;
1288+
end;
1289+
",
1290+
);
1291+
1292+
let (root, diagnostics) = builder.get_analyzed_root();
1293+
check_no_diagnostics(&diagnostics);
1294+
1295+
assert!(root
1296+
.search_reference(code.source(), code.s1("assert true;").s1("true").start())
1297+
.is_some());
1298+
}
1299+
12801300
#[test]
12811301
fn ambiguous_boolean_conversion_favors_boolean() {
12821302
let mut builder = LibraryBuilder::new();

0 commit comments

Comments
 (0)