// RUN: %target-typecheck-verify-swift -swift-version 4

// https://bugs.swift.org/browse/SR-3452
// See test/Compatibility/enum_element_pattern.swift for Swift3 behavior.
// As for FIXME cases: see https://bugs.swift.org/browse/SR-3466

enum E {
  case A, B, C, D

  static func testE(e: E) {
    switch e {
    case A<UndefinedTy>(): // expected-error {{cannot specialize a non-generic definition}}
    // expected-note@-1 {{while parsing this '<' as a type parameter bracket}}
      break
    case B<Int>(): // expected-error {{cannot specialize a non-generic definition}} expected-note {{while parsing this '<' as a type parameter bracket}}
      break
    default:
      break;
    }
  }
}

func testE(e: E) {
  switch e {
  case E.A<UndefinedTy>(): // expected-error {{cannot specialize a non-generic definition}}
  // expected-note@-1 {{while parsing this '<' as a type parameter bracket}}
    break
  case E.B<Int>(): // expected-error {{cannot specialize a non-generic definition}} expected-note {{while parsing this '<' as a type parameter bracket}}
    break
  case .C(): // FIXME: This should be rejected as well.
    break
  case .D(let payload): // FIXME: ditto.
    let _: () = payload
    break
  default:
    break
  }

  guard
    // Currently, these will be asserted in SILGen,
    // or in no-assert build, verify-failed in IRGen
    case .C() = e, // FIXME: Should be rejected.
    case .D(let payload) = e // FIXME: ditto.
  else { return }
}

extension E : Error {}
func canThrow() throws {
  throw E.A
}

do {
  try canThrow()
} catch E.A() { // FIXME: Should be rejected.
  // ..
} catch E.B(let payload) { // FIXME: ditto.
  let _: () = payload
}
