// 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
{
{
a {{
{{
( { {
{
{
{{:a
}}}let a{{
{
{ {d b{}}}}}b}}}}}}<T}}}class S<T{func a<h{func b<T where h.g=a
{
func a{
if true{
}
struct d<T where g
func
{init(
{ (( (( )
let f=A{
[:e
}}}protocol P{
{
let g{
{
[{A
{
{
func a{func {
{{
func x:
{ {
{{{
a{
struct d<T where g{
{
{ {
"
{ {
[ { ()a{let v:
{ (
{ (
a{
{protocol P{
"class c
{
if true{
{{
{
if true{
struct B<T where I:a{
"
{ {g:{(){
{
let v:d<T where I:a=g
[{func{ {d b{}}}}}b}}}}}}<T}}}class S<T{func a<h{func b<T where h.g=a
{
}let a<T where T{{
typealias b:a{{T:
{
func a{struct S<b{
struct d
{
func a{
a{g=F
func x:
{
{
{d b{}}}}}b}}}}}}<T}}}class S<T{func a<h{func b<T where h.g=a
class d<T where I:
[:a{
let(
{
func a{
{
a{
a{{let t=0
class b:C{
a typealias b:Int=i{
{ {struct B{
"
{
let h{{class c{func x
typealias F
{
{
}protocol a
var b:a{(
"class b{
protocol P{
{
}struct d
{
{{}}}}protocol P{{
{ :a{
{ {
{
func{ a{init()a{
{ (
{g
{{
{ (
{
protocol A{
{
{
{ {{
typealias e:a{
{{
"
{
{{
{ {struct d<b:
d
let v:a
{
{
if true{
{
{typealias e{
func f{
{ {
func a{protocol P{{T:
var b{typealias e{
{ a{typealias b{let a{
func a<b{{
[{
{protocol P{
a typealias b:a=F
{
{
{
if true{
let f{{
(({
{
{}let g{
protocol a<T where g{let h{{
""
{let h{{struct d<T where g
struct S
{( ){let t:
var b{
{ {
protocol{{
protocol P{
{
{
{ {
func
}}protocol A{{
let v:e
{
{ {protocol b:
{
{
struct S<T where T:a<b:
{
a typealias e{
{
{
{
{{typealias f{let v:(()
{:C{{{
{
{{{{
func a{
{
{
func a
{}}}enum S<b{
{
( : ( )
{( : ( : ( : ( { {
struct d
{
{
{
"
protocol P{
class b{((
a {
{
((x
{{
{typealias e
}
{{
{
{
[{
a {{
{ :d= .c{
{e a{}
}}}
{{
{ ({{func b{func a
[{(
(){A<T:
{ {:a{
{
{
{
[ { {
{
d
{ ({func x
{{:
class A<T where I:a{A{
{{A
{
{{
func a{{let t:C{
[ {
{
struct Q{
class b{func a{
class A
{
{{
{{func
{
{{let v:a
struct d<T where I:e:
struct d<h}}}protocol A<h{}enum S
let t=F=g:a{let a{
{(
:
{ {
let a{
