diff options
author | Kushal Pal <kushalpal109@gmail.com> | 2024-01-03 16:02:07 +0530 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-30 12:36:51 +0100 |
commit | f46fdb6399d91d56f095088c8cf0f1fd6d971e25 (patch) | |
tree | 6baae6c9dad4ce80c6682db26cd327dfd59ee769 | |
parent | 8b7d6adbbb886039f8c6e14a581dcbc9c63ce380 (diff) | |
download | gcc-f46fdb6399d91d56f095088c8cf0f1fd6d971e25.zip gcc-f46fdb6399d91d56f095088c8cf0f1fd6d971e25.tar.gz gcc-f46fdb6399d91d56f095088c8cf0f1fd6d971e25.tar.bz2 |
gccrs: Handle `async` functions in traits
Fixes #2785
gcc/rust/ChangeLog:
* checks/errors/rust-ast-validation.cc (ASTValidation::visit):
Added check for `async` functions inside trait.
* parse/rust-parse-impl.h (Parser::parse_trait_item):
Added switch-case for ASYNC token.
gcc/testsuite/ChangeLog:
* rust/compile/issue-2785.rs: New test.
Signed-off-by: Kushal Pal <kushalpal109@gmail.com>
-rw-r--r-- | gcc/rust/checks/errors/rust-ast-validation.cc | 13 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-2785.rs | 9 |
3 files changed, 20 insertions, 3 deletions
diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc index b50e9cd..0ed5d06 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.cc +++ b/gcc/rust/checks/errors/rust-ast-validation.cc @@ -141,9 +141,16 @@ ASTValidation::visit (AST::TraitFunctionDecl &decl) { const auto &qualifiers = decl.get_qualifiers (); - if (context.back () == Context::TRAIT && qualifiers.is_const ()) - rust_error_at (decl.get_identifier ().get_locus (), ErrorCode::E0379, - "functions in traits cannot be declared const"); + if (context.back () == Context::TRAIT) + { + // may change soon + if (qualifiers.is_async ()) + rust_error_at (decl.get_identifier ().get_locus (), ErrorCode::E0706, + "functions in traits cannot be declared %<async%>"); + if (qualifiers.is_const ()) + rust_error_at (decl.get_identifier ().get_locus (), ErrorCode::E0379, + "functions in traits cannot be declared const"); + } } void diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index dfa2762..3055a39 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -5096,6 +5096,7 @@ Parser<ManagedTokenSource>::parse_trait_item () // else, fallthrough to function // TODO: find out how to disable gcc "implicit fallthrough" error gcc_fallthrough (); + case ASYNC: case UNSAFE: case EXTERN_KW: case FN_KW: { diff --git a/gcc/testsuite/rust/compile/issue-2785.rs b/gcc/testsuite/rust/compile/issue-2785.rs new file mode 100644 index 0000000..08f6346 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2785.rs @@ -0,0 +1,9 @@ +// { dg-additional-options "-frust-edition=2018" } +trait Foo { + async fn foo(){} + // { dg-error "functions in traits cannot be declared .async." "" { target *-*-* } .-1 } + async fn bar(); + // { dg-error "functions in traits cannot be declared .async." "" { target *-*-* } .-1 } +} + +fn main() {} |