Skip to content

Commit 8f06591

Browse files
olwangclaude
andcommitted
Merge fix/module-call-byvalue: module free call lowers by value, not borrow
Fixes rss run E0308 (&T vs T) for bare module-qualified calls (m.fn()); de-prefixed modules in tinygrad-rsmc now execute. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2 parents 9006ea0 + 0fab4be commit 8f06591

14 files changed

Lines changed: 88 additions & 36 deletions

File tree

crates/rsscript/src/analyzer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6250,7 +6250,7 @@ fn callee_display(callee: &Callee) -> String {
62506250
effect,
62516251
} => format!(
62526252
"{} {}.{method}",
6253-
effect.as_str(),
6253+
(*effect).unwrap_or(DataEffect::Read).as_str(),
62546254
analyzer_expr_label(receiver)
62556255
),
62566256
}

crates/rsscript/src/checks/body.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3355,7 +3355,7 @@ fn body_callee_display(callee: &Callee) -> String {
33553355
receiver,
33563356
method,
33573357
effect,
3358-
} => format!("{} {}.{method}", effect.as_str(), body_expr_label(receiver)),
3358+
} => format!("{} {}.{method}", (*effect).unwrap_or(DataEffect::Read).as_str(), body_expr_label(receiver)),
33593359
}
33603360
}
33613361

crates/rsscript/src/checks/calls.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1993,13 +1993,13 @@ fn check_receiver_call_self_effect(
19931993
);
19941994
return;
19951995
};
1996-
if expected.as_str() != effect.as_str() {
1996+
if expected.as_str() != (*effect).unwrap_or(DataEffect::Read).as_str() {
19971997
analyzer.diagnostics.push(
19981998
Diagnostic::error(
19991999
code::MISSING_DATA_EFFECT,
20002000
format!(
20012001
"receiver `{receiver_label}` for `{method}` uses `{}` but the method requires `{}`.",
2002-
effect.as_str(),
2002+
(*effect).unwrap_or(DataEffect::Read).as_str(),
20032003
expected.as_str()
20042004
),
20052005
call_span.clone(),
@@ -4509,7 +4509,7 @@ fn callee_display(callee: &Callee) -> String {
45094509
receiver,
45104510
method,
45114511
effect,
4512-
} => format!("{} {}.{method}", effect.as_str(), call_expr_label(receiver)),
4512+
} => format!("{} {}.{method}", (*effect).unwrap_or(DataEffect::Read).as_str(), call_expr_label(receiver)),
45134513
}
45144514
}
45154515

@@ -4533,7 +4533,7 @@ fn expr_data_effect(expr: &HirExpr) -> Option<&'static str> {
45334533
HirExpr::Call {
45344534
callee:
45354535
Callee::ReceiverCall {
4536-
effect: DataEffect::Read,
4536+
effect: Some(DataEffect::Read) | None,
45374537
..
45384538
},
45394539
..

crates/rsscript/src/checks/local.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1441,7 +1441,7 @@ fn callee_display(callee: &Callee) -> String {
14411441
effect,
14421442
} => format!(
14431443
"{} {}.{method}",
1444-
effect.as_str(),
1444+
(*effect).map(|e| e.as_str()).unwrap_or("read"),
14451445
local_expr_label(receiver)
14461446
),
14471447
}

crates/rsscript/src/formatter.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -987,8 +987,8 @@ impl Formatter {
987987
method,
988988
effect,
989989
} => {
990-
if *effect != DataEffect::Read {
991-
self.out.push_str(effect.as_str());
990+
if (*effect).unwrap_or(DataEffect::Read) != DataEffect::Read {
991+
self.out.push_str((*effect).unwrap_or(DataEffect::Read).as_str());
992992
self.out.push(' ');
993993
}
994994
self.expr_at(receiver, 0, indent);
@@ -1209,10 +1209,10 @@ fn inline_callee(callee: &Callee) -> Option<String> {
12091209
method,
12101210
effect,
12111211
} => {
1212-
let prefix = if *effect == DataEffect::Read {
1212+
let prefix = if (*effect).unwrap_or(DataEffect::Read) == DataEffect::Read {
12131213
String::new()
12141214
} else {
1215-
format!("{} ", effect.as_str())
1215+
format!("{} ", (*effect).unwrap_or(DataEffect::Read).as_str())
12161216
};
12171217
Some(format!("{prefix}{}.{}", inline_expr(receiver)?, method))
12181218
}
@@ -1233,7 +1233,7 @@ fn receiver_call_segments(expr: &Expr) -> Option<ReceiverCallSegments<'_>> {
12331233
..
12341234
} = current
12351235
{
1236-
if *effect != DataEffect::Read {
1236+
if (*effect).unwrap_or(DataEffect::Read) != DataEffect::Read {
12371237
return None;
12381238
}
12391239
segments.push((method.as_str(), args.as_slice()));

crates/rsscript/src/hir.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,7 +1862,7 @@ fn lower_hir_expr(
18621862
receiver, effect, ..
18631863
} => Some(HirCallReceiver {
18641864
value: Box::new(lower_hir_expr(hir, function_name, receiver, value_types)),
1865-
effect: param_effect_from_data_effect(*effect),
1865+
effect: param_effect_from_data_effect((*effect).unwrap_or(DataEffect::Read)),
18661866
type_name: receiver_type,
18671867
resolved_namespace,
18681868
}),
@@ -3384,7 +3384,7 @@ fn callee_display(callee: &Callee) -> String {
33843384
effect,
33853385
} => format!(
33863386
"{} {}.{method}",
3387-
effect.as_str(),
3387+
(*effect).map(|e| e.as_str()).unwrap_or("read"),
33883388
receiver_call_label(receiver)
33893389
),
33903390
}

crates/rsscript/src/package/review.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1821,7 +1821,7 @@ fn callee_label(callee: &Callee) -> String {
18211821
effect,
18221822
} => format!(
18231823
"{} {}.{method}",
1824-
effect.as_str(),
1824+
(*effect).map(|e| e.as_str()).unwrap_or("read"),
18251825
package_expr_label(receiver)
18261826
),
18271827
}

crates/rsscript/src/review.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,21 +1451,21 @@ fn collect_review_map_facts_expr(
14511451
facts.receiver_calls.push(ReviewMapReceiverCall {
14521452
line: span.line,
14531453
column: span.column,
1454-
source: format!("{} {receiver_label}.{method}", effect.as_str()),
1454+
source: format!("{} {receiver_label}.{method}", (*effect).map(|e| e.as_str()).unwrap_or("read")),
14551455
canonical_callee: namespace
14561456
.map(|namespace| format!("{namespace}.{method}"))
14571457
.unwrap_or_else(|| format!("<unresolved>.{method}")),
1458-
self_effect: effect.as_str().to_string(),
1458+
self_effect: (*effect).map(|e| e.as_str()).unwrap_or("read").to_string(),
14591459
resolution: receiver_call_resolution_label(&resolution).to_string(),
14601460
});
14611461
resolution
14621462
} else {
14631463
facts.receiver_calls.push(ReviewMapReceiverCall {
14641464
line: span.line,
14651465
column: span.column,
1466-
source: format!("{} {receiver_label}.{method}", effect.as_str()),
1466+
source: format!("{} {receiver_label}.{method}", (*effect).map(|e| e.as_str()).unwrap_or("read")),
14671467
canonical_callee: format!("<unresolved>.{method}"),
1468-
self_effect: effect.as_str().to_string(),
1468+
self_effect: (*effect).map(|e| e.as_str()).unwrap_or("read").to_string(),
14691469
resolution: "unknown".to_string(),
14701470
});
14711471
CallResolution::Unknown
@@ -2443,7 +2443,7 @@ fn review_callee_display(callee: &Callee) -> String {
24432443
effect,
24442444
} => format!(
24452445
"{} {}.{method}",
2446-
effect.as_str(),
2446+
(*effect).map(|e| e.as_str()).unwrap_or("read"),
24472447
review_expr_label(receiver)
24482448
),
24492449
}

crates/rsscript/src/rust_lower/helpers.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,7 @@ pub(super) fn collect_mutated_bindings_from_expr(expr: &Expr, names: &mut BTreeS
812812
if let Callee::ReceiverCall {
813813
receiver, effect, ..
814814
} = callee
815-
&& *effect == DataEffect::Mut
815+
&& (*effect) == Some(DataEffect::Mut)
816816
&& let Some(root) = expr_root_name(receiver)
817817
{
818818
names.insert(root.to_string());

crates/rsscript/src/rust_lower/lowerer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2650,7 +2650,7 @@ impl<'a> RustLowerer<'a> {
26502650
})
26512651
.unwrap_or(receiver_type_root);
26522652
let is_protocol = self.protocol_names.contains(&namespace);
2653-
let lowered_receiver = match effect {
2653+
let lowered_receiver = match (*effect).unwrap_or(DataEffect::Read) {
26542654
DataEffect::Mut
26552655
if let Expr::Ident(receiver_name, _) = receiver.as_ref()
26562656
&& self.param_effects.get(receiver_name)
@@ -3420,7 +3420,7 @@ impl<'a> RustLowerer<'a> {
34203420
Expr::Call {
34213421
callee:
34223422
Callee::ReceiverCall {
3423-
effect: DataEffect::Read,
3423+
effect: Some(DataEffect::Read) | None,
34243424
method,
34253425
..
34263426
},

0 commit comments

Comments
 (0)