// rustfmt-normalize_comments: true
// Match expressions.

fn foo() {
    // A match expression.
    match x {
        // Some comment.
        a => foo(),
        b if 0 < 42 => foo(),
        c => { // Another comment.
            // Comment.
            an_expression;
            foo()
        }
        Foo(ref bar) =>
            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
        Pattern1 | Pattern2 | Pattern3 => false,
        Paternnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn |
        Paternnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn => {
            blah
        }
        Patternnnnnnnnnnnnnnnnnnn |
        Patternnnnnnnnnnnnnnnnnnn |
        Patternnnnnnnnnnnnnnnnnnn |
        Patternnnnnnnnnnnnnnnnnnn => meh,

        Patternnnnnnnnnnnnnnnnnnn |
        Patternnnnnnnnnnnnnnnnnnn if looooooooooooooooooong_guard => meh,

        Patternnnnnnnnnnnnnnnnnnnnnnnnn |
        Patternnnnnnnnnnnnnnnnnnnnnnnnn if looooooooooooooooooooooooooooooooooooooooong_guard =>
            meh,

        // Test that earlier patterns can take the guard space
        (aaaa, bbbbb, ccccccc, aaaaa, bbbbbbbb, cccccc, aaaa, bbbbbbbb, cccccc, dddddd) |
        Patternnnnnnnnnnnnnnnnnnnnnnnnn if loooooooooooooooooooooooooooooooooooooooooong_guard => {}

        _ => {}
        ast::PathParameters::AngleBracketedParameters(ref data) if data.lifetimes.len() > 0 ||
                                                                   data.types.len() > 0 ||
                                                                   data.bindings.len() > 0 => {}
    }

    let whatever = match something {
        /// DOC COMMENT!
        Some(_) => 42,
        // Comment on an attribute.
        #[an_attribute]
        // Comment after an attribute.
        None => 0,
        #[rustfmt::skip]
        Blurb     =>     {                  }
    };
}

// Test that a match on an overflow line is laid out properly.
fn main() {
    let sub_span =
        match xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {
            Some(sub_span) => Some(sub_span),
            None => sub_span,
        };
}

// Test that one-line bodies align.
fn main() {
    match r {
        Variableeeeeeeeeeeeeeeeee => (    "variable",
                                      vec!("id", "name", "qualname",
                                           "value", "type", "scopeid"),
                                      true,
                                      true),
        Enummmmmmmmmmmmmmmmmmmmm => ("enum",
                                     vec!("id","qualname","scopeid","value"),
                                     true,
                                     true),
        Variantttttttttttttttttttttttt => ("variant",
                                           vec!("id",
                                                "name",
                                                "qualname",
                                                "type",
                                                "value",
                                                "scopeid"),
                                           true,
                                           true),
    };

    match  x{
    y=>{/*Block with comment. Preserve me.*/  }
    z=>{stmt();} }
}

fn matches() {
    match 1 {
        -1 => 10,
        1 => 1, // foo
        2 => 2,
        // bar
        3 => 3,
        _ => 0 // baz
    }
}

fn match_skip() {
    let _ = match Some(1) {
        #[rustfmt::skip]
        Some( n ) => n,
        None      => 1,
    };
}

fn issue339() {
    match a {
        b => {}
        c => { }
        d => {
        }
        e => {



        }
        // collapsing here is safe
        ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff => {
        }
        // collapsing here exceeds line length
        ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffg => {
        }
        h => { // comment above block
        }
        i => {
        } // comment below block
        j => {
            // comment inside block
        }
        j2 => {
            // comments inside...
        } // ... and after
        // TODO uncomment when vertical whitespace is handled better
        // k => {
        //
        //     // comment with WS above
        // }
        // l => {
        //     // comment with ws below
        //     
        // }
        m => {
        } n => { } o =>
        {

        }
        p => { // Don't collapse me
        } q => { } r =>
        {

        }
        s => 0, // s comment
        // t comment
        t => 1,
        u => 2,
        v => {
        } /* funky block
           * comment */
        // final comment
    }
}

fn issue355() {
    match mac {
        a => println!("a", b),
        b => vec!(1, 2),
        c => vec!(3; 4),
        d => {
            println!("a", b)
        }
        e => {
            vec!(1, 2)
        }
        f => {
            vec!(3; 4)
        }
        h => println!("a", b), // h comment
        i => vec!(1, 2), // i comment
        j => vec!(3; 4), // j comment
        // k comment
        k => println!("a", b),
        // l comment
        l => vec!(1, 2),
        // m comment
        m => vec!(3; 4),
        // Rewrite splits macro
        nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn => println!("a", b),
        // Rewrite splits macro
        oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo => vec!(1, 2),
        // Macro support fails to recognise this macro as splittable
        // We push the whole expr to a new line, TODO split this macro as well
        pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp => vec!(3; 4),
        // q, r and s: Rewrite splits match arm
        qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq => println!("a", b),
        rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr => vec!(1, 2),
        ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss => vec!(3; 4),
        // Funky bracketing styles
        t =>      println!{"a", b},
        u => vec!{1, 2},
        v => vec!{3; 4},
        w => println!["a", b],
        x =>      vec![1, 2],
        y =>vec![3; 4],
        // Brackets with comments
        tc => println!{"a", b}, // comment
        uc => vec!{1, 2}, // comment
        vc =>vec!{3; 4}, // comment
        wc =>println!["a", b], // comment
        xc => vec![1,2], // comment
        yc =>        vec![3; 4], // comment
        yd =>
            looooooooooooooooooooooooooooooooooooooooooooooooooooooooong_func(aaaaaaaaaa,
                                                                              bbbbbbbbbb,
                                                                              cccccccccc,
                                                                              dddddddddd),
    }
}

fn issue280() {
    {
        match x {
            CompressionMode::DiscardNewline | CompressionMode::CompressWhitespaceNewline => ch ==
                                                                                            '\n',
            ast::ItemConst(ref typ, ref expr) => self.process_static_or_const_item(item,
                                                                                   &typ,
                                                                                   &expr),
        }
    }
}

fn issue383() {
    match resolution.last_private {LastImport{..} => false, _ => true};
}

fn issue507() {
    match 1 {
        1 => unsafe { std::intrinsics::abort() },
        _ => (),
    }
}

fn issue508() {
    match s.type_id() {
        Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
                    HTMLElementTypeId::HTMLCanvasElement))) => true,
        Some(NodeTypeId::Element(ElementTypeId::HTMLElement(
                        HTMLElementTypeId::HTMLObjectElement))) => s.has_object_data(),
        Some(NodeTypeId::Element(_)) => false,
    }
}

fn issue496() {{{{
    match def {
        def::DefConst(def_id) | def::DefAssociatedConst(def_id) =>
            match const_eval::lookup_const_by_id(cx.tcx, def_id, Some(self.pat.id)) {
                Some(const_expr) => { x }}}}}}}

fn issue494() {
    {
        match stmt.node {
             hir::StmtExpr(ref expr, id) | hir::StmtSemi(ref expr, id) =>
                result.push(
                    StmtRef::Mirror(
                        Box::new(Stmt { span: stmt.span,
                                        kind: StmtKind::Expr {
                                            scope: cx.tcx.region_maps.node_extent(id),
                                            expr: expr.to_ref() } }))),
        }
    }
}

fn issue386() {
    match foo {
        BiEq | BiLt | BiLe | BiNe | BiGt | BiGe =>
                    true,
        BiAnd | BiOr | BiAdd | BiSub | BiMul | BiDiv | BiRem |
        BiBitXor | BiBitAnd | BiBitOr | BiShl | BiShr =>
            false,
    }
}

fn guards() {
    match foo {
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if foooooooooooooo && barrrrrrrrrrrr => {}
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if foooooooooooooo && barrrrrrrrrrrr => {}
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
            if fooooooooooooooooooooo &&
               (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb || cccccccccccccccccccccccccccccccccccccccc) => {}
        Hi { friend } if let None = friend => {}
        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if let Some(foooooooooooooo) = hiiiiiiiiiiiiiii => {}
        aaaaaaaaaaaaaaaaa if let Superman { powers: Some(goteem), .. } = all::get_random_being::<Super>() => {}
    }
}

fn issue1371() {
    Some(match type_ {
        sfEvtClosed => Closed,
        sfEvtResized => {
            let e = unsafe { *event.size.as_ref() };

            Resized {
                width: e.width,
                height: e.height,
            }
        }
        sfEvtLostFocus => LostFocus,
        sfEvtGainedFocus => GainedFocus,
        sfEvtTextEntered => {
            TextEntered {
                unicode: unsafe {
                    ::std::char::from_u32((*event.text.as_ref()).unicode)
                        .expect("Invalid unicode encountered on TextEntered event")
                },
            }
        }
        sfEvtKeyPressed => {
            let e = unsafe { event.key.as_ref() };

            KeyPressed {
                code: unsafe { ::std::mem::transmute(e.code) },
                alt: e.alt.to_bool(),
                ctrl: e.control.to_bool(),
                shift: e.shift.to_bool(),
                system: e.system.to_bool(),
            }
        }
        sfEvtKeyReleased => {
            let e = unsafe { event.key.as_ref() };

            KeyReleased {
                code: unsafe { ::std::mem::transmute(e.code) },
                alt: e.alt.to_bool(),
                ctrl: e.control.to_bool(),
                shift: e.shift.to_bool(),
                system: e.system.to_bool(),
            }
        }
    })
}

fn issue1395() {
    let bar = Some(true);
    let foo = Some(true);
    let mut x = false;
    bar.and_then(|_| {
        match foo {
            None => None,
            Some(b) => {
                x = true;
                Some(b)
            }
        }
    });
}

fn issue1456() {
    Ok(Recording {
        artists: match reader.evaluate(".//mb:recording/mb:artist-credit/mb:name-credit")? {
            Nodeset(nodeset) => {
                let res: Result<Vec<ArtistRef>, ReadError> = nodeset
                    .iter()
                    .map(|node| {
                        XPathNodeReader::new(node, &context).and_then(|r| ArtistRef::from_xml(&r))
                    })
                    .collect();
                res?
            }
            _ => Vec::new(),
        },
    })
}

fn issue1460() {
    let _ = match foo {
        REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT => "internal_spec_insert_internal_spec_insert_internal_spec_insert",
        _ => "reorder_something",
    };
}

fn issue525() {
    foobar(f, "{}", match *self {
        TaskState::Started => "started",
        TaskState::Success => "success",
        TaskState::Failed => "failed",
    });
}

// #1838, #1839
fn match_with_near_max_width() {
    let (this_line_uses_99_characters_and_is_formatted_properly, x012345) = match some_expression   {
        _ => unimplemented!(),
    };

    let (should_be_formatted_like_the_line_above_using_100_characters, x0) = match some_expression  {
        _ => unimplemented!(),
    };

    let (should_put_the_brace_on_the_next_line_using_101_characters, x0000) = match some_expression
    {
        _ => unimplemented!(),
    };
    match m {
        Variant::Tag | Variant::Tag2 | Variant::Tag3 | Variant::Tag4 | Variant::Tag5 | Variant::Tag6 =>
        {}
    }
}

fn match_with_trailing_spaces() {
    match x {    
        
        Some(..) => 0,
        None => 1,
    }
}

fn issue_2099() {
    let a = match x {
};
    let b = match x {
        
    };

    match x {}
}

// #2021
impl<'tcx> Const<'tcx> {
    pub fn from_constval<'a>() -> Const<'tcx> {
        let val = match *cv {
            ConstVal::Variant(_) | ConstVal::Aggregate(..) | ConstVal::Unevaluated(..) => bug!("MIR must not use `{:?}` (aggregates are expanded to MIR rvalues)", cv),
        };
    }
}

// #2151
fn issue_2151() {
    match either {
        x => {

        }y => ()
    }
}

// #2152
fn issue_2152() {
    match m {
        "aaaaaaaaaaaaa" | "bbbbbbbbbbbbb" | "cccccccccccccccccccccccccccccccccccccccccccc" if true => {}
        "bind" | "writev" | "readv" | "sendmsg" | "recvmsg" if android && (aarch64 || x86_64) => true,
    }
}

// #2376
// Preserve block around expressions with condition.
fn issue_2376() {
    let mut x = None;
    match x {
        Some(0) => {
            for i in 1..11 {
                x = Some(i);
            }
        }
        Some(ref mut y) => {
            while *y < 10 {
                *y += 1;
            }
        }
        None => {
            while let None = x {
                x = Some(10);
            }
        }
    }
}

// #2621
// Strip leading `|` in match arm patterns
fn issue_2621() {
    let x = Foo::A;
    match x {
        Foo::A => println!("No vert single condition"),
        Foo::B | Foo::C => println!("Center vert two conditions"),
        | Foo::D => println!("Preceding vert single condition"),
        | Foo::E
        | Foo::F => println!("Preceding vert over two lines"),
        Foo::G |
        Foo::H => println!("Trailing vert over two lines"),
        // Comment on its own line
        | Foo::I => println!("With comment"), // Comment after line
    }
}

fn issue_2377() {
    match tok {
        Tok::Not
        | Tok::BNot
        | Tok::Plus
        | Tok::Minus
        | Tok::PlusPlus
        | Tok::MinusMinus
        | Tok::Void
        | Tok::Delete if prec <= 16 => {
            // code here...
        }
        Tok::TypeOf if prec <= 16 => {}
    }
}

// #3040
fn issue_3040() {
    {
        match foo {
            DevtoolScriptControlMsg::WantsLiveNotifications(id, to_send) => {
                match documents.find_window(id) {
                    Some(window) => devtools::handle_wants_live_notifications(window.upcast(), to_send),
                    None => return warn!("Message sent to closed pipeline {}.", id),
                }
            }
        }
    }
}

// #3030
fn issue_3030() {
    match input.trim().parse::<f64>() {
        Ok(val)
            if !(
    // A valid number is the same as what rust considers to be valid,
    // except for +1., NaN, and Infinity.
                val.is_infinite() || val
                    .is_nan() || input.ends_with(".") || input.starts_with("+")
            )
            => {
            }
    }
}

fn issue_3005() {
            match *token {
                 Token::Dimension {
                     value, ref unit, ..
                 } if num_context.is_ok(context.parsing_mode, value) =>
                 {
                     return NoCalcLength::parse_dimension(context, value, unit)
                         .map(LengthOrPercentage::Length)
                         .map_err(|()| location.new_unexpected_token_error(token.clone()));
                 },
             }
}

// #3774
fn issue_3774() {
    {
        {
            {
                match foo {
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => unreachab(),
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => unreacha!(),
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => unreachabl(),
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => unreachae!(),
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => unreachable(),
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => unreachable!(),
                    Lam(_, _, _) | Pi(_, _, _) | Let(_, _, _, _) | Embed(_) | Var(_) => rrunreachable!(),
                }
            }
        }
    }
}

// #4109
fn issue_4109() {
    match () {
        _ => {
#[cfg(debug_assertions)]
{
println!("Foo");
}
}
}

match () {
_ => {
#[allow(unsafe_code)]
unsafe {}
}
}
}
