mirror of
				https://git.proxmox.com/git/rustc
				synced 2025-11-04 02:07:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// Here we test that rest patterns, i.e. `..`, are not allowed
 | 
						|
// outside of slice (+ ident patterns within those), tuple,
 | 
						|
// and tuple struct patterns and that duplicates are caught in these contexts.
 | 
						|
 | 
						|
#![feature(box_patterns)]
 | 
						|
 | 
						|
fn main() {}
 | 
						|
 | 
						|
macro_rules! mk_pat {
 | 
						|
    () => { .. } //~ ERROR `..` patterns are not allowed here
 | 
						|
}
 | 
						|
 | 
						|
fn rest_patterns() {
 | 
						|
    let mk_pat!();
 | 
						|
 | 
						|
    // Top level:
 | 
						|
    fn foo(..: u8) {} //~ ERROR `..` patterns are not allowed here
 | 
						|
    let ..;  //~ ERROR `..` patterns are not allowed here
 | 
						|
 | 
						|
    // Box patterns:
 | 
						|
    let box ..;  //~ ERROR `..` patterns are not allowed here
 | 
						|
 | 
						|
    // In or-patterns:
 | 
						|
    match 1 {
 | 
						|
        1 | .. => {} //~ ERROR `..` patterns are not allowed here
 | 
						|
    }
 | 
						|
 | 
						|
    // Ref patterns:
 | 
						|
    let &..; //~ ERROR `..` patterns are not allowed here
 | 
						|
    let &mut ..; //~ ERROR `..` patterns are not allowed here
 | 
						|
 | 
						|
    // Ident patterns:
 | 
						|
    let x @ ..; //~ ERROR `..` patterns are not allowed here
 | 
						|
    //~^ ERROR type annotations needed
 | 
						|
    let ref x @ ..; //~ ERROR `..` patterns are not allowed here
 | 
						|
    let ref mut x @ ..; //~ ERROR `..` patterns are not allowed here
 | 
						|
 | 
						|
    // Tuple:
 | 
						|
    let (..): (u8,); // OK.
 | 
						|
    let (..,): (u8,); // OK.
 | 
						|
    let (
 | 
						|
        ..,
 | 
						|
        .., //~ ERROR `..` can only be used once per tuple pattern
 | 
						|
        .. //~ ERROR `..` can only be used once per tuple pattern
 | 
						|
    ): (u8, u8, u8);
 | 
						|
    let (
 | 
						|
        ..,
 | 
						|
        x,
 | 
						|
        .. //~ ERROR `..` can only be used once per tuple pattern
 | 
						|
    ): (u8, u8, u8);
 | 
						|
 | 
						|
    struct A(u8, u8, u8);
 | 
						|
 | 
						|
    // Tuple struct (same idea as for tuple patterns):
 | 
						|
    let A(..); // OK.
 | 
						|
    let A(..,); // OK.
 | 
						|
    let A(
 | 
						|
        ..,
 | 
						|
        .., //~ ERROR `..` can only be used once per tuple struct pattern
 | 
						|
        .. //~ ERROR `..` can only be used once per tuple struct pattern
 | 
						|
    );
 | 
						|
    let A(
 | 
						|
        ..,
 | 
						|
        x,
 | 
						|
        .. //~ ERROR `..` can only be used once per tuple struct pattern
 | 
						|
    );
 | 
						|
 | 
						|
    // Array/Slice:
 | 
						|
    let [..]: &[u8]; // OK.
 | 
						|
    let [..,]: &[u8]; // OK.
 | 
						|
    let [
 | 
						|
        ..,
 | 
						|
        .., //~ ERROR `..` can only be used once per slice pattern
 | 
						|
        .. //~ ERROR `..` can only be used once per slice pattern
 | 
						|
    ]: &[u8];
 | 
						|
    let [
 | 
						|
        ..,
 | 
						|
        ref x @ .., //~ ERROR `..` can only be used once per slice pattern
 | 
						|
        ref mut y @ .., //~ ERROR `..` can only be used once per slice pattern
 | 
						|
        (ref z @ ..), //~ ERROR `..` patterns are not allowed here
 | 
						|
        .. //~ ERROR `..` can only be used once per slice pattern
 | 
						|
    ]: &[u8];
 | 
						|
}
 |