gccrs: Move SlicePattern RestPattern handling

This allows the AST to represent SlicePattern instances with more than
one RestPattern child, which allows us to handle invalid SlicePattern
instances which would be cfg'd out and mostly avoid dealing with the
implications of a RestPattern until HIR lowering.

gcc/rust/ChangeLog:

	* ast/rust-ast-collector.cc
	(TokenCollector::visit (SlicePatternItemsNoRest)): Remove
	function definition.
	(TokenCollector::visit (SlicePatternItemsHasRest)): Likewise.
	(TokenCollector::visit (SlicePattern)): Handle sub-patterns.
	* ast/rust-ast-collector.h
	(TokenCollector::visit (SlicePatternItemsNoRest)): Remove
	function declaration.
	(TokenCollector::visit (SlicePatternItemsHasRest)): Likewise.
	* ast/rust-ast-full-decls.h (class SlicePatternItemsNoRest):
	Remove forward declaration.
	(class SlicePatternItemsHasRest): Likewise.
	* ast/rust-ast-pointer-visitor.cc
	(PointerVisitor::visit (SlicePatternItemsNoRest)): Remove
	function definition.
	(PointerVisitor::visit (SlicePatternItemsHasRest)): Likewise.
	(PointerVisitor::visit (SlicePattern)): New function
	definition.
	* ast/rust-ast-pointer-visitor.h
	(PointerVisitor::visit (SlicePatternItemsNoRest)): Remove
	function declaration.
	(PointerVisitor::visit (SlicePatternItemsHasRest)): Likewise.
	(PointerVisitor::visit (SlicePattern)): New function
	declaration.
	* ast/rust-ast-visitor.cc
	(DefaultASTVisitor::visit (SlicePatternItemsNoRest)): Remove
	function definition.
	(DefaultASTVisitor::visit (SlicePatternItemsHasRest)): Likewise.
	(DefaultASTVisitor::visit (SlicePattern)): Handle sub-patterns.
	* ast/rust-ast-visitor.h
	(ASTVisitor::visit (SlicePatternItemsNoRest)): Remove function
	declaration.
	(ASTVisitor::visit (SlicePatternItemsHasRest)): Likewise.
	(DefaultASTVisitor::visit (SlicePatternItemsNoRest)): Likewise.
	(DefaultASTVisitor::visit (SlicePatternItemsHasRest)): Likewise.
	* ast/rust-pattern.cc (SlicePatternItemsNoRest::as_string):
	Remove function definition.
	(SlicePatternItemsHasRest::as_string): Likewise.
	(SlicePattern::as_string): Use as_string on sub patterns
	directly.
	(SlicePatternItemsNoRest::accept_vis): Remove function
	definition.
	(SlicePatternItemsHasRest::accept_vis): Likewise.
	* ast/rust-pattern.h (class SlicePatternItems): Remove.
	(class SlicePatternItemsNoRest): Remove.
	(class SlicePatternItemsHasRest): Remove.
	(SlicePattern::items): Remove member variable.
	(SlicePattern::patterns): New member variable.
	(SlicePattern::SlicePattern): Adjust to match member variable
	adjustments.
	(SlicePattern::get_items): Remove function.
	(SlicePattern::get_patterns): New function.
	(class CloneableDelegate<std::unique_ptr<SlicePatternItems>>):
	Remove specialization.
	* checks/errors/rust-ast-validation.cc
	(ASTValidation::visit (SlicePattern)): New function to check for
	too many RestPattern sub-patterns.
	* checks/errors/rust-ast-validation.h
	(ASTValidation::visit (SlicePattern)): New function declaration.
	* expand/rust-cfg-strip.cc
	(CfgStrip::visit (SlicePatternItemsNoRest)): Remove function
	definition.
	(CfgStrip::visit (SlicePatternItemsHasRest)): Likewise.
	(CfgStrip::visit (SlicePattern)): Directly visit sub-patterns.
	* expand/rust-cfg-strip.h
	(CfgStrip::visit (SlicePatternItemsNoRest)): Remove function
	declaration.
	(CfgStrip::visit (SlicePatternItemsHasRest)): Likewise.
	* expand/rust-derive.h
	(DeriveVisitor::visit (SlicePatternItemsNoRest)): Remove
	function.
	(DeriveVisitor::visit (SlicePatternItemsHasRest)): Likewise.
	* hir/rust-ast-lower-base.cc
	(ASTLoweringBase::visit (SlicePatternItemsNoRest)): Remove
	function definition.
	(ASTLoweringBase::visit (SlicePatternItemsHasRest)): Likewise.
	(ASTLoweringBase::lower_slice_pattern_no_rest): Likewise.
	(ASTLoweringBase::lower_slice_pattern_has_rest): Likewise.
	* hir/rust-ast-lower-base.h
	(ASTLoweringBase::visit (SlicePatternItemsNoRest)): Remove
	function declaration.
	(ASTLoweringBase::visit (SlicePatternItemsHasRest)): Likewise.
	(ASTLoweringBase::lower_slice_pattern_no_rest): Likewise.
	(ASTLoweringBase::lower_slice_pattern_has_rest): Likewise.
	* hir/rust-ast-lower-pattern.cc (lower_pattern_seq): New
	function.
	(ASTLoweringPattern::visit (SlicePattern)): Handle changes to
	AST SlicePattern.
	* parse/rust-parse-impl-pattern.hxx
	(Parser::parse_slice_pattern): Likewise.

gcc/testsuite/ChangeLog:

	* rust/compile/slice_rest_pattern.rs: Verify that too many rest
	patterns in a slice pattern does not produce an error, if that
	slice pattern is cfg'd out.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
19 files changed