Skip to content

Commit

Permalink
Added error for unhandled error types.
Browse files Browse the repository at this point in the history
Closes #3960.

commit-id:e7d01089
  • Loading branch information
orizi committed Nov 23, 2023
1 parent c6f4634 commit 3aae5ec
Show file tree
Hide file tree
Showing 10 changed files with 2,923 additions and 2,842 deletions.
9 changes: 9 additions & 0 deletions crates/cairo-lang-filesystem/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,21 @@ impl Edition {
}
}

/// Whether to ignore visibility modifiers.
pub fn ignore_visibility(&self) -> bool {
match self {
Self::V2023_01 | Self::V2023_10 => true,
Self::V2023_11 => false,
}
}

/// Whether to ignore unhandled error types.
pub fn ignore_unhandled_error_type(&self) -> bool {
match self {
Self::V2023_01 | Self::V2023_10 => true,
Self::V2023_11 => false,
}
}
}

// Salsa database interface.
Expand Down
6 changes: 6 additions & 0 deletions crates/cairo-lang-semantic/src/diagnostic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,9 @@ impl DiagnosticEntry for SemanticDiagnostic {
SemanticDiagnosticKind::ErrorPropagateOnNonErrorType { ty } => {
format!(r#"Type "{}" can not error propagate"#, ty.format(db))
}
SemanticDiagnosticKind::UnhandledErrorType { ty } => {
format!(r#"Unhandled error type "{}""#, ty.format(db))
}
SemanticDiagnosticKind::InvalidMemberExpression => "Invalid member expression.".into(),
SemanticDiagnosticKind::InvalidPath => "Invalid path.".into(),
SemanticDiagnosticKind::RefArgNotAVariable => "ref argument must be a variable.".into(),
Expand Down Expand Up @@ -796,6 +799,9 @@ pub enum SemanticDiagnosticKind {
ErrorPropagateOnNonErrorType {
ty: semantic::TypeId,
},
UnhandledErrorType {
ty: semantic::TypeId,
},
ConstGenericParamSupported,
RefArgNotAVariable,
RefArgNotMutable,
Expand Down
6 changes: 6 additions & 0 deletions crates/cairo-lang-semantic/src/expr/compute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2074,6 +2074,12 @@ pub fn compute_statement_semantic(
// Point to after the expression, where the semicolon is missing.
ctx.diagnostics.report_after(&expr_syntax, MissingSemicolon);
}
let ty = expr.ty();
if !ctx.resolver.edition.ignore_unhandled_error_type()
&& unwrap_error_propagation_type(ctx.db, ty).is_some()
{
ctx.diagnostics.report(&expr_syntax, UnhandledErrorType { ty });
}
semantic::Statement::Expr(semantic::StatementExpr {
expr: expr.id,
stable_ptr: syntax.stable_ptr(),
Expand Down
2 changes: 1 addition & 1 deletion crates/cairo-lang-semantic/src/resolve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ impl ResolverData {
pub struct Resolver<'db> {
db: &'db dyn SemanticGroup,
pub data: ResolverData,
edition: Edition,
pub edition: Edition,
}
impl Deref for Resolver<'_> {
type Target = ResolverData;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ trait IMintableToken<T> {
#[starknet::contract]
mod token_bridge {
use core::num::traits::Zero;
use starknet::SyscallResultTrait;
use starknet::{
ContractAddress, get_caller_address, EthAddress, syscalls::send_message_to_l1_syscall
};
Expand Down Expand Up @@ -126,7 +127,8 @@ mod token_bridge {
];
send_message_to_l1_syscall(
to_address: self.read_initialized_l1_bridge(), payload: message_payload.span()
);
)
.unwrap_syscall();
self.emit(WithdrawInitiated { l1_recipient, amount, caller_address });
}
}
Expand Down
4 changes: 2 additions & 2 deletions crates/cairo-lang-starknet/cairo_level_tests/events.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,8 @@ fn test_pop_log() {
let mut data = array![];
keys.append(1234);
data.append(2345);
starknet::emit_event_syscall(keys.span(), data.span());
starknet::emit_event_syscall(keys.span(), data.span());
starknet::emit_event_syscall(keys.span(), data.span()).unwrap_syscall();
starknet::emit_event_syscall(keys.span(), data.span()).unwrap_syscall();

let (keys, data) = starknet::testing::pop_log_raw(contract_address).unwrap();
assert_eq!(keys.len(), 1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use contract_with_messages_sent_to_l1::IContractWithMessagesSentToL1;

#[starknet::contract]
mod contract_with_messages_sent_to_l1 {
use starknet::SyscallResultTrait;
use core::traits::Into;
use core::array::ArrayTrait;

Expand All @@ -34,7 +35,8 @@ mod contract_with_messages_sent_to_l1 {

starknet::send_message_to_l1_syscall(
to_address: value_.into(), payload: generate_payload(n: value_).span()
);
)
.unwrap_syscall();
self.value.write(value_ + 1);
}
}
Expand Down Expand Up @@ -104,8 +106,8 @@ fn test_pop_l2_to_l1_message() {
let mut to_address = 1234;
let mut payload = array![2345];

starknet::send_message_to_l1_syscall(to_address, payload.span());
starknet::send_message_to_l1_syscall(to_address, payload.span());
starknet::send_message_to_l1_syscall(to_address, payload.span()).unwrap_syscall();
starknet::send_message_to_l1_syscall(to_address, payload.span()).unwrap_syscall();

let (to_address, payload) = starknet::testing::pop_l2_to_l1_message(contract_address).unwrap();
assert_eq!(payload.len(), 1);
Expand Down
Loading

0 comments on commit 3aae5ec

Please sign in to comment.