Skip to content

Commit

Permalink
Return Error Ptr
Browse files Browse the repository at this point in the history
  • Loading branch information
Tomer-StarkWare committed Dec 2, 2024
1 parent 17a7e9b commit d5a2c11
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 5 deletions.
8 changes: 7 additions & 1 deletion crates/cairo-lang-semantic/src/expr/compute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,7 @@ pub fn compute_root_expr(
ctx: &mut ComputationContext<'_>,
syntax: &ast::ExprBlock,
return_type: TypeId,
return_ptr: Option<impl Into<SyntaxStablePtrId>>,
) -> Maybe<ExprId> {
// Conform TypeEqual constraints for Associated type bounds.
let inference = &mut ctx.resolver.data.inference_data.inference(ctx.db);
Expand Down Expand Up @@ -1096,7 +1097,12 @@ pub fn compute_root_expr(
if let Err((err_set, actual_ty, expected_ty)) =
inference.conform_ty_for_diag(res_ty, return_type)
{
let diag_added = ctx.diagnostics.report(syntax, WrongReturnType { expected_ty, actual_ty });
let diag_added = match return_ptr {
None => ctx.diagnostics.report(syntax, WrongReturnType { expected_ty, actual_ty }),
Some(stable_ptr) => {
ctx.diagnostics.report(stable_ptr, WrongReturnType { expected_ty, actual_ty })
}
};
inference.consume_reported_error(err_set, diag_added);
}

Expand Down
85 changes: 85 additions & 0 deletions crates/cairo-lang-semantic/src/expr/test_data/function_call
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,88 @@ error: Trait has no implementation in context: core::traits::Add::<test::MyStruc
--> lib.cairo:13:5
d + 0;
^***^

//! > ==========================================================================

//! > Wrong return type

//! > test_runner_name
test_function_diagnostics(expect_diagnostics: true)

//! > function
fn foo() -> () {
4_u16
}

//! > function_name
foo

//! > module_code
fn bar() -> u8 {}

//! > expected_diagnostics
error: Unexpected return type. Expected: "core::integer::u8", found: "()".
--> lib.cairo:1:13
fn bar() -> u8 {}
^^

error: Unexpected return type. Expected: "()", found: "core::integer::u16".
--> lib.cairo:2:13
fn foo() -> () {
^^

//! > ==========================================================================

//! > Trait return wrong return type

//! > test_runner_name
test_function_diagnostics(expect_diagnostics: true)

//! > function
fn foo() -> () {}

//! > function_name
foo

//! > module_code
trait MyTrait {
fn bar() -> u8 {
1_u16
}
}

//! > expected_diagnostics
error: Unexpected return type. Expected: "core::integer::u8", found: "core::integer::u16".
--> lib.cairo:2:17
fn bar() -> u8 {
^^

//! > ==========================================================================

//! > Impl return wrong return type

//! > test_runner_name
test_function_diagnostics(expect_diagnostics: true)

//! > function
fn foo() -> () {}

//! > function_name
foo

//! > module_code
trait MyTrait {
fn bar() -> u8;
}

impl MyImpl of MyTrait {
fn bar() -> u8 {
1_u16
}
}

//! > expected_diagnostics
error: Unexpected return type. Expected: "core::integer::u8", found: "core::integer::u16".
--> lib.cairo:6:17
fn bar() -> u8 {
^^
18 changes: 16 additions & 2 deletions crates/cairo-lang-semantic/src/items/free_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use cairo_lang_defs::ids::{
};
use cairo_lang_diagnostics::{Diagnostics, Maybe, ToMaybe};
use cairo_lang_syntax::attribute::structured::AttributeListStructurize;
use cairo_lang_syntax::node::ast::OptionReturnTypeClause;
use cairo_lang_syntax::node::{TypedStablePtr, TypedSyntaxNode};
use cairo_lang_utils::Intern;
use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;
Expand Down Expand Up @@ -221,7 +222,6 @@ pub fn priv_free_function_body_data(
let free_function_syntax = db.module_free_function_by_id(free_function_id)?.to_maybe()?;
// Compute declaration semantic.
let declaration = db.priv_free_function_declaration_data(free_function_id)?;

// Generic params.
let parent_resolver_data = db.free_function_declaration_resolver_data(free_function_id)?;
let inference_id = InferenceId::LookupItemDefinition(LookupItemId::ModuleItem(
Expand All @@ -247,7 +247,21 @@ pub fn priv_free_function_body_data(
);
let function_body = free_function_syntax.body(db.upcast());
let return_type = declaration.signature.return_type;
let body_expr = compute_root_expr(&mut ctx, &function_body, return_type)?;
let body_expr = compute_root_expr(
&mut ctx,
&function_body,
return_type,
match free_function_syntax
.declaration(db.upcast())
.signature(db.upcast())
.ret_ty(db.upcast())
{
OptionReturnTypeClause::Empty(_) => None,
OptionReturnTypeClause::ReturnTypeClause(return_type_clause) => {
Some(return_type_clause.ty(db.upcast()).stable_ptr())
}
},
)?;
let ComputationContext { arenas: Arenas { exprs, patterns, statements }, resolver, .. } = ctx;

let expr_lookup: UnorderedHashMap<_, _> =
Expand Down
12 changes: 11 additions & 1 deletion crates/cairo-lang-semantic/src/items/imp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3328,7 +3328,17 @@ pub fn priv_impl_function_body_data(
);
let function_body = function_syntax.body(db.upcast());
let return_type = declaration.function_declaration_data.signature.return_type;
let body_expr = compute_root_expr(&mut ctx, &function_body, return_type)?;
let body_expr = compute_root_expr(
&mut ctx,
&function_body,
return_type,
match function_syntax.declaration(db.upcast()).signature(db.upcast()).ret_ty(db.upcast()) {
OptionReturnTypeClause::Empty(_) => None,
OptionReturnTypeClause::ReturnTypeClause(return_type_clause) => {
Some(return_type_clause.ty(db.upcast()).stable_ptr())
}
},
)?;
let ComputationContext { arenas: Arenas { exprs, patterns, statements }, resolver, .. } = ctx;

let expr_lookup: UnorderedHashMap<_, _> =
Expand Down
13 changes: 12 additions & 1 deletion crates/cairo-lang-semantic/src/items/trt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use cairo_lang_defs::ids::{
use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe, ToMaybe};
use cairo_lang_proc_macros::{DebugWithDb, SemanticObject};
use cairo_lang_syntax::attribute::structured::{Attribute, AttributeListStructurize};
use cairo_lang_syntax::node::ast::OptionReturnTypeClause;
use cairo_lang_syntax::node::db::SyntaxGroup;
use cairo_lang_syntax::node::helpers::OptionWrappedGenericParamListHelper;
use cairo_lang_syntax::node::{Terminal, TypedStablePtr, TypedSyntaxNode, ast};
Expand Down Expand Up @@ -1396,7 +1397,17 @@ pub fn priv_trait_function_body_data(
ast::MaybeTraitFunctionBody::None(_) => return Ok(None),
};
let return_type = trait_function_declaration_data.signature.return_type;
let body_expr = compute_root_expr(&mut ctx, &function_body, return_type)?;
let body_expr = compute_root_expr(
&mut ctx,
&function_body,
return_type,
match function_syntax.declaration(db.upcast()).signature(db.upcast()).ret_ty(db.upcast()) {
OptionReturnTypeClause::Empty(_) => None,
OptionReturnTypeClause::ReturnTypeClause(return_type_clause) => {
Some(return_type_clause.ty(db.upcast()).stable_ptr())
}
},
)?;
let ComputationContext { arenas: Arenas { exprs, patterns, statements }, resolver, .. } = ctx;

let expr_lookup: UnorderedHashMap<_, _> =
Expand Down

0 comments on commit d5a2c11

Please sign in to comment.