// 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
}}}}struct S<T where I.d
}}}
(A.c}}}struct Q{
protocol A{
struct B<T where T:A}
{enum S<T where h:b
func f
}protocol a{
return[T:d
{
func a{
}
struct B<T where I.c
}}}
var d>:A<g:a{
}}
{{
{
{
func j}
var d:d{{{struct E{class A{{}let a=[[protocol
func b
}{{{enum k{{
func f
""1
{
struct S
class a{{{func e=e{class b
if true{}}
if true{class D{}}
}protocol a}protocol A.d
struct B:c
{}
let a
}}
struct E{{
(A}
struct S<T where B:Boolean w
func j}}{
}}
1
}}}
if true{class a{
}protocol a{
{{{
struct B:a{{{
class
class b{{enum k{
{var d{func e
struct S<T where g:a{class i
}}}
}
class a{enum S
""
return[T->{
{
class A{func e
}}class a{
struct B:A.c
class b<T where I.c:d
"1
let a{{}protocol a{{
{{class a<T where T:c}}
class a
{typealias d{
}}
class i
struct E{
class a{func f
}}}
{
struct E{a{}struct S
}}}
class b
{}
class b{
{class a{
}}}struct B:a{var d{
{}
{class i
{
}
}
}}}protocol A.c
{{class D{func f
class
return[T:A{a{class d>{
protocol a
{enum S<T where T:a
func a{{
{}{enum S<T where h:A{func f
struct B:d{{var d
(((((((A<T where T:A<T:Boolean w
{}class D{
{{{
struct B<g:A.c
struct B:d{class A {}}{func e
}}{func e{
{{
{{
(A<T where g:d:b
}protocol a
func a{
var d{func b{{{{
struct B<T where I.c:a<T where B:a
struct E{class D{{}
return[T:a<T where B<T where h}protocol A.d.c
{
{class a
func e{
class a{
class
}
{}struct E{
{{{func e
}print
class b {typealias e
}}{}print
}}protocol A.d<T:a{
{
{{class a{{typealias d.c}}}protocol a{class b{
{{
{struct E{class A{{}let a=[[protocol
{
{typealias e
}
return[T:a
class
var d>:a{func e
(A{func j}
{{var d{
""
func b{
{
}}
{class A {
(A{{struct E{class A{{}let a=[[protocol
func e{
{{
}}}print
let a}struct E{
}}protocol d
if true{
if true{{}struct E{{
(((A{{class b typealias e
struct E{
{{
{{
(A}typealias e
struct E{class a{
{class D{class D{
{{{class i
return[T:b{{class d>:A.c:a
((A<T where T:a
}extension h}print
{{{var d<T where g:A}
class A.c
}typealias e
class d{
class d.c:a
class a
}}
}}
struct B<T where B<T where k{{{class A {{{
struct E{{}
{enum S<T where h
