Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added error for unhandled error types. #4454

Merged
merged 1 commit into from
Nov 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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