// RUN: %target-typecheck-verify-swift -swift-version 4 -package-name mypkg public struct Pair {} public struct PublicStruct { public struct Inner {} package struct PkgInner {} internal struct Internal {} // expected-note * {{type declared here}} } private typealias PrivateAlias = PublicStruct // expected-note * {{type declared here}} package typealias PackageAlias = PublicStruct // expected-note * {{type declared here}} public let a0 = nil as PrivateAlias.Inner? // expected-error {{constant cannot be declared public because its type 'PrivateAlias.Inner?' (aka 'Optional') uses a private type}} public let a: PrivateAlias.Inner? // expected-error {{constant cannot be declared public because its type uses a private type}} public let b: PrivateAlias.Internal? // expected-error {{constant cannot be declared public because its type uses a private type}} public let c: Pair? // expected-error {{constant cannot be declared public because its type uses a private type}} public let c2: Pair? // expected-error {{constant cannot be declared public because its type uses a private type}} public let d: PrivateAlias? // expected-error {{constant cannot be declared public because its type uses a private type}} package let e = nil as PrivateAlias.Inner? // expected-error {{constant cannot be declared package because its type 'PrivateAlias.Inner?' (aka 'Optional') uses a private type}} package let f: PrivateAlias.Inner? // expected-error {{constant cannot be declared package because its type uses a private type}} package let g: PrivateAlias.PkgInner? // expected-error {{constant cannot be declared package because its type uses a private type}} package let h: Pair? // expected-error {{constant cannot be declared package because its type uses a private type}} package let i: Pair? // expected-error {{constant cannot be declared package because its type uses a private type}} package let j: PrivateAlias? // expected-error {{constant cannot be declared package because its type uses a private type}} public let k = nil as PackageAlias.Inner? // expected-error {{constant cannot be declared public because its type 'PackageAlias.Inner?' (aka 'Optional') uses a package type}} public let l: PackageAlias.Inner? // expected-error {{constant cannot be declared public because its type uses a package type}} public let m: PackageAlias.Internal? // expected-error {{constant cannot be declared public because its type uses an internal type}} public let n: Pair? // expected-error {{constant cannot be declared public because its type uses an internal type}} public let o: Pair? // expected-error {{constant cannot be declared public because its type uses an internal type}} public let p: PackageAlias? // expected-error {{constant cannot be declared public because its type uses a package type}} package let q = nil as PackageAlias.Inner? // no-error package let r: PackageAlias.Inner? // no-error package let s: PackageAlias.Internal? // expected-error {{constant cannot be declared package because its type uses an internal type}} package let t: Pair? // expected-error {{constant cannot be declared package because its type uses an internal type}} package let u: Pair? // expected-error {{constant cannot be declared package because its type uses an internal type}} package let v: PackageAlias? // no-error // rdar://problem/21408035 private class PrivateBox { // expected-note 2 {{type declared here}} typealias ValueType = T typealias AlwaysFloat = Float } let boxUnboxInt: PrivateBox.ValueType = 0 // expected-error {{constant must be declared private or fileprivate because its type uses a private type}} let boxFloat: PrivateBox.AlwaysFloat = 0 // expected-error {{constant must be declared private or fileprivate because its type uses a private type}} private protocol PrivateProto { associatedtype Inner } extension PublicStruct: PrivateProto {} private class SpecificBox { // expected-note 2 {{type declared here}} typealias InnerType = T.Inner typealias AlwaysFloat = Float } let specificBoxUnboxInt: SpecificBox.InnerType = .init() // expected-error {{constant must be declared private or fileprivate because its type uses a private type}} let specificBoxFloat: SpecificBox.AlwaysFloat = 0 // expected-error {{constant must be declared private or fileprivate because its type uses a private type}}