]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add error message for AltPattern in let statements
authorOwen Avery <powerboat9.gamer@gmail.com>
Fri, 21 Apr 2023 05:43:25 +0000 (01:43 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:34:10 +0000 (18:34 +0100)
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>
gcc/rust/hir/rust-ast-lower-pattern.cc
gcc/rust/hir/rust-ast-lower-pattern.h
gcc/rust/hir/rust-ast-lower-stmt.cc
gcc/testsuite/rust/compile/let_alt.rs [new file with mode: 0644]

index 2f2395d21a08b91f11324c131db83d079a8c2f9e..7717953dbd81d7a9b1f5b9cb568c92eb937a9763 100644 (file)
@@ -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
index 2b16e7aeef8e21c97ead17a9e9014dc633296b13..155308ef385a64b9ce8b85a38d9227fbfd2f5bac 100644 (file)
@@ -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
index be9add9b8b5891ca8963c13db6062052ea8ba03d..dc14cb0608f65c2343eb3dda389b19f95964d8b7 100644 (file)
@@ -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 (file)
index 0000000..1284627
--- /dev/null
@@ -0,0 +1,4 @@
+fn main() {
+    let _a | _a = 12;
+    // { dg-error "top level alternate patterns are not allowed" "" { target *-*-* } .-1 }
+}