diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-04-21 01:43:25 -0400 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-04-21 07:38:21 +0000 |
commit | 428a31804b8c56fd8aee8b7db7adf087e350ad60 (patch) | |
tree | 8d00af19d5aaf1fb0e41676685b77c3997d07385 | |
parent | 3013c408b0d34cd9e2f3906132f6b5ff26cd5966 (diff) | |
download | gcc-428a31804b8c56fd8aee8b7db7adf087e350ad60.zip gcc-428a31804b8c56fd8aee8b7db7adf087e350ad60.tar.gz gcc-428a31804b8c56fd8aee8b7db7adf087e350ad60.tar.bz2 |
Add error message for AltPattern in let statements
gcc/rust/ChangeLog:
* hir/rust-ast-lower-pattern.cc
(ASTLoweringPattern::translate): Add is_let_top_level parameter.
(ASTLoweringPattern::visit): Handle is_let_top_level.
* hir/rust-ast-lower-pattern.h
(class ASTLoweringPattern): Add is_let_top_level.
* hir/rust-ast-lower-stmt.cc
(ASTLoweringStmt::visit): Set is_let_top_level.
gcc/testsuite/ChangeLog:
* rust/compile/let_alt.rs: New test.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-pattern.cc | 8 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-pattern.h | 4 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-stmt.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/let_alt.rs | 4 |
4 files changed, 15 insertions, 3 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc index 646e623..b37d663 100644 --- a/gcc/rust/hir/rust-ast-lower-pattern.cc +++ b/gcc/rust/hir/rust-ast-lower-pattern.cc @@ -25,9 +25,10 @@ namespace HIR { ASTLoweringPattern::ASTLoweringPattern () : translated (nullptr) {} HIR::Pattern * -ASTLoweringPattern::translate (AST::Pattern *pattern) +ASTLoweringPattern::translate (AST::Pattern *pattern, bool is_let_top_level) { ASTLoweringPattern resolver; + resolver.is_let_top_level = is_let_top_level; pattern->accept_vis (resolver); rust_assert (resolver.translated != nullptr); @@ -315,6 +316,11 @@ ASTLoweringPattern::visit (AST::AltPattern &pattern) translated = new HIR::AltPattern (mapping, std::move (alts), pattern.get_locus ()); + + if (is_let_top_level) + rust_error_at (pattern.get_locus (), + "top level alternate patterns are not allowed for %<let%> " + "bindings - use an outer grouped pattern"); } } // namespace HIR diff --git a/gcc/rust/hir/rust-ast-lower-pattern.h b/gcc/rust/hir/rust-ast-lower-pattern.h index 4f265e3..597a5d2 100644 --- a/gcc/rust/hir/rust-ast-lower-pattern.h +++ b/gcc/rust/hir/rust-ast-lower-pattern.h @@ -29,7 +29,8 @@ class ASTLoweringPattern : public ASTLoweringBase using Rust::HIR::ASTLoweringBase::visit; public: - static HIR::Pattern *translate (AST::Pattern *pattern); + static HIR::Pattern *translate (AST::Pattern *pattern, + bool is_let_top_level = false); void visit (AST::IdentifierPattern &pattern) override; void visit (AST::PathInExpression &pattern) override; @@ -48,6 +49,7 @@ private: ASTLoweringPattern (); HIR::Pattern *translated; + bool is_let_top_level; }; } // namespace HIR diff --git a/gcc/rust/hir/rust-ast-lower-stmt.cc b/gcc/rust/hir/rust-ast-lower-stmt.cc index be9add9..dc14cb0 100644 --- a/gcc/rust/hir/rust-ast-lower-stmt.cc +++ b/gcc/rust/hir/rust-ast-lower-stmt.cc @@ -108,7 +108,7 @@ void ASTLoweringStmt::visit (AST::LetStmt &stmt) { HIR::Pattern *variables - = ASTLoweringPattern::translate (stmt.get_pattern ().get ()); + = ASTLoweringPattern::translate (stmt.get_pattern ().get (), true); HIR::Type *type = stmt.has_type () ? ASTLoweringType::translate (stmt.get_type ().get ()) : nullptr; diff --git a/gcc/testsuite/rust/compile/let_alt.rs b/gcc/testsuite/rust/compile/let_alt.rs new file mode 100644 index 0000000..1284627 --- /dev/null +++ b/gcc/testsuite/rust/compile/let_alt.rs @@ -0,0 +1,4 @@ +fn main() { + let _a | _a = 12; + // { dg-error "top level alternate patterns are not allowed" "" { target *-*-* } .-1 } +} |