Skip to content

Commit 1e91f01

Browse files
no snapshot peeling from type_enriched_members key. (#7229)
1 parent 8df416d commit 1e91f01

File tree

3 files changed

+66
-8
lines changed

3 files changed

+66
-8
lines changed

crates/cairo-lang-semantic/src/expr/compute.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3039,13 +3039,11 @@ fn get_enriched_type_member_access(
30393039
stable_ptr: ast::ExprPtr,
30403040
accessed_member_name: &str,
30413041
) -> Maybe<Option<EnrichedTypeMemberAccess>> {
3042-
let (_, mut long_ty) = peel_snapshots(ctx.db, expr.ty());
3043-
if matches!(long_ty, TypeLongId::Var(_)) {
3044-
// Save some work. ignore the result. The error, if any, will be reported later.
3045-
ctx.resolver.inference().solve().ok();
3046-
long_ty = ctx.resolver.inference().rewrite(long_ty).no_err();
3047-
}
3048-
let (_, long_ty) = peel_snapshots_ex(ctx.db, long_ty);
3042+
// Run solver to get as much info on the type as possible.
3043+
// Ignore the result of the `solve()` call - the error, if any, will be
3044+
// reported later.
3045+
ctx.resolver.inference().solve().ok();
3046+
let ty = ctx.reduce_ty(expr.ty());
30493047
let base_var = match &expr.expr {
30503048
Expr::Var(expr_var) => Some(expr_var.var),
30513049
Expr::MemberAccess(ExprMemberAccess { member_path: Some(member_path), .. }) => {
@@ -3056,7 +3054,6 @@ fn get_enriched_type_member_access(
30563054
let is_mut_var = base_var
30573055
.filter(|var_id| matches!(ctx.semantic_defs.get(var_id), Some(var) if var.is_mut()))
30583056
.is_some();
3059-
let ty = long_ty.clone().intern(ctx.db);
30603057
let key = (ty, is_mut_var);
30613058
let mut enriched_members = match ctx.resolver.type_enriched_members.entry(key) {
30623059
Entry::Occupied(entry) => {
@@ -3074,6 +3071,7 @@ fn get_enriched_type_member_access(
30743071
entry.swap_remove()
30753072
}
30763073
Entry::Vacant(_) => {
3074+
let (_, long_ty) = peel_snapshots(ctx.db, ty);
30773075
let members =
30783076
if let TypeLongId::Concrete(ConcreteTypeId::Struct(concrete_struct_id)) = long_ty {
30793077
let members = ctx.db.concrete_struct_members(concrete_struct_id)?;

crates/cairo-lang-semantic/src/expr/test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ cairo_lang_test_utils::test_file_test!(
3434
constructor: "constructor",
3535
closure: "closure",
3636
coupon: "coupon",
37+
deref: "deref",
3738
enum_: "enum",
3839
error_propagate: "error_propagate",
3940
for_: "for",
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//! > different S3 and @S3 derefs.
2+
3+
//! > test_runner_name
4+
test_function_diagnostics(expect_diagnostics: false)
5+
6+
//! > function
7+
fn foo() {
8+
let s1 = S1 { a: 1, b: 2 };
9+
let s2 = S2 { inner: s1, c: 5 };
10+
let s3 = S3 { inner: s2 };
11+
12+
(@s3).a;
13+
s3.c;
14+
}
15+
16+
//! > function_name
17+
foo
18+
19+
//! > module_code
20+
#[derive(Drop, Copy)]
21+
struct S1 {
22+
a: usize,
23+
b: felt252,
24+
}
25+
26+
#[derive(Drop, Copy)]
27+
struct S2 {
28+
inner: S1,
29+
c: usize,
30+
}
31+
32+
#[derive(Drop)]
33+
struct S3 {
34+
inner: S2,
35+
}
36+
37+
38+
impl S2Deref of core::ops::Deref<S2> {
39+
type Target = S1;
40+
fn deref(self: S2) -> S1 {
41+
self.inner
42+
}
43+
}
44+
45+
impl S3Deref of core::ops::Deref<S3> {
46+
type Target = S2;
47+
fn deref(self: S3) -> S2 {
48+
self.inner
49+
}
50+
}
51+
52+
impl S3SnapDeref of core::ops::Deref<@S3> {
53+
type Target = S1;
54+
fn deref(self: @S3) -> S1 {
55+
*self.inner.inner
56+
}
57+
}
58+
59+
//! > expected_diagnostics

0 commit comments

Comments
 (0)