// 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
>())
func g<1 {
let f = D> a {
}
extension A {
}
class func a<d = g<j : () {
f<b(n: l.B = ["
}
get {
}
enum b {
protocol c == [0)
""""\() {
self.a<Int>) {
var f.advance()
import Foundation
var d where S(i(v: B<T.Type) {
import Foundation
func a
case c>: a {
enum b {
return !)
class func c<T.e == B
d(n: A? = g<d
return nil
public var f(i: A {
}
}
a() {
typealias h, ()
struct c {
}
map(true }
print())-> String {
b(b(() -> V {
}
func a
case A"
class A> e() {
func i: ()
enum B : end)) {
class A? {
self.e where l) -> String {
}
}
class func f.d {
}
return [1):
}
}
convenience init() {
print() {
let a {
}
let a {
}
}
protocol A {
let a
var b<T) -> Self {
default:
typealias B
S.Iterator.f : S<b(A(A>() -> T {
protocol b {
}
init(#object1, k : AnyObject.c
typealias d((b(b
return $0
return NSData(a)
}
}
}
protocol d where A<T>) {
class A {
}
}
let h> {
let h = Swift.advance(A, length: A<D> : B)
var d {
func f.Iterator.A"
func e<d<D>()
}
protocol a {
S<d
typealias B
}
}
func d
func e(false))
func e!
}
}
}
class A<T where T : String {
func f: a {
typealias b = b: d {
}
class B : Sequence> ()
}
}
}
