// This source file is part of the Swift.org open source project
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors

// RUN: not %target-swift-frontend %s -typecheck
protocol a {
var b = { _, Bool) -> ({
init() -> Any {
extension A where T, x = .b: A {
func a(f)
}
}
static let i<T>)
protocol a {
protocol a {
}
struct c
func c(T> {
}
}
enum B {
convenience init(() {
let f = Swift.b(")
}
func f: a {
struct X.C(g: Sequence> U>()
var b(v: b: ExtensibleCollectionType>() -> {
var a(n: B? = ""foobar"a<I : Any, Any) -> ([0x31] in
}
}() {
self.d {
}
enum A {
import Foundation
var b {
return "")
enum B {
func ^("cd")
class B = T]]
}
}
case C<D> Any) {
}
}
}
}
}
case c
func a<d = {
return "cd"A.Element == e> U {
}
let b in 0] == d(_ = nil
}
var b() -> {
case C: b[self, self.Type
return nil
for c = T> [T>(bytes: a<h> U {
enum A {
protocol a {
}
typealias f == f)(b[Byte]
f() -> {
import Foundation
protocol A {
}
typealias f : T) -> {
}
d.f : String = {
protocol A {
print()
}
return "]
static let f = [1
public class B : a {
assert(a(Any)
let a<T>] = B) -> String {
}
case C
struct c {
func a<h == "A>() { self.<T
return ")
typealias e : d = {
let t: B)-> U>: Any, Any, b {
class c<T! {
"""ab""
}
print() {
class A.advance() -> e? = B
return [0x31] {
}
return self.h>()
protocol A = B
}
d<T> String {
var b = {
class A {
}
}
}
func f())
