From: Owen Avery Date: Fri, 21 Apr 2023 05:43:25 +0000 (-0400) Subject: gccrs: Add error message for AltPattern in let statements X-Git-Tag: basepoints/gcc-15~2643 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0b48fddeee8497369d39dcd5904bbf808cb52bd3;p=thirdparty%2Fgcc.git gccrs: 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 --- diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc index 2f2395d21a08..7717953dbd81 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 % " + "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 2b16e7aeef8e..155308ef385a 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 be9add9b8b58..dc14cb0608f6 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 000000000000..1284627bb729 --- /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 } +}