aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-04-21 01:43:25 -0400
committerCohenArthur <arthur.cohen@embecosm.com>2023-04-21 07:38:21 +0000
commit428a31804b8c56fd8aee8b7db7adf087e350ad60 (patch)
tree8d00af19d5aaf1fb0e41676685b77c3997d07385
parent3013c408b0d34cd9e2f3906132f6b5ff26cd5966 (diff)
downloadgcc-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.cc8
-rw-r--r--gcc/rust/hir/rust-ast-lower-pattern.h4
-rw-r--r--gcc/rust/hir/rust-ast-lower-stmt.cc2
-rw-r--r--gcc/testsuite/rust/compile/let_alt.rs4
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 }
+}