Skip to content

Commit 4db1ab5

Browse files
authored
Merge pull request #2288 from taichi-ishitani/conv_type_expression
Fix `referring_before_definition` error during converting type expression
2 parents 7bbba61 + 40eda95 commit 4db1ab5

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

crates/analyzer/src/conv/utils.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,19 +1264,28 @@ pub fn eval_factor_path(
12641264
comptime.is_global = true;
12651265
Ok(ir::Factor::Anonymous(comptime))
12661266
} else if let Ok(symbol) = symbol_table::resolve(&generic_path) {
1267-
// To resolve external symbol reference,
1268-
// use an independent context to avoid name conflict
1269-
let mut external_context = Context::default();
1270-
external_context.inherit(context);
1271-
1272-
external_context.push_generic_map(generic_path.to_generic_maps());
1273-
let ret = external_context
1274-
.block(|c| eval_external_symbol(c, generic_path, symbol, allow_unknown_value, token));
1267+
let is_inernal = context
1268+
.currnet_namespace()
1269+
.map(|x| symbol.found.namespace.included(&x))
1270+
.unwrap_or(false);
1271+
if is_inernal {
1272+
eval_external_symbol(context, generic_path, symbol, allow_unknown_value, token)
1273+
} else {
1274+
// To resolve external symbol reference,
1275+
// use an independent context to avoid name conflict
1276+
let mut external_context = Context::default();
1277+
external_context.inherit(context);
1278+
1279+
external_context.push_generic_map(generic_path.to_generic_maps());
1280+
let ret = external_context.block(|c| {
1281+
eval_external_symbol(c, generic_path, symbol, allow_unknown_value, token)
1282+
});
12751283

1276-
external_context.pop_generic_map();
1277-
context.inherit(&mut external_context);
1284+
external_context.pop_generic_map();
1285+
context.inherit(&mut external_context);
12781286

1279-
ret
1287+
ret
1288+
}
12801289
} else {
12811290
Err(ir_error!(token))
12821291
}

crates/analyzer/src/tests.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5386,6 +5386,22 @@ fn referring_before_definition() {
53865386
AnalyzerError::ReferringBeforeDefinition { .. }
53875387
));
53885388

5389+
let code = r#"
5390+
package A {
5391+
const A: u32 = 1;
5392+
const X: type = logic<A>;
5393+
5394+
struct Y {
5395+
x: X,
5396+
}
5397+
5398+
const Z: type = Y;
5399+
}
5400+
"#;
5401+
5402+
let errors = analyze(code);
5403+
assert!(errors.is_empty());
5404+
53895405
let code = r#"
53905406
module ModuleA #(
53915407
param A: u32 = 16,

0 commit comments

Comments
 (0)