Files
swift-mirror/test/Sema/accessibility_package_inline.swift
Ellie Shin 772e42e448 Add a missing check for a corner case with package use site / internal decl site
Update tests

Resolves rdar://106732804, rdar://104987455
2023-03-28 16:59:20 -07:00

173 lines
4.9 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: split-file %s %t
// RUN: %target-swift-frontend -verify -module-name UtilsGood %t/UtilsGood.swift -emit-module -emit-module-path %t/UtilsGood.swiftmodule -package-name myLib
// RUN: test -f %t/UtilsGood.swiftmodule
// RUN: %target-swift-frontend -typecheck -verify %t/Utils.swift -package-name myLib -I %t
// RUN: %target-swift-frontend -typecheck -verify %t/LibOtherPackage.swift -package-name otherLib -I %t
// RUN: %target-swift-frontend -typecheck -verify %t/LibSamePackage.swift -package-name myLib -I %t
//--- Utils.swift
package protocol PackageProto {
var pkgVar: Double { get set }
func pkgFunc()
}
// expected-note@+1 *{{class 'PackageKlass' is not '@usableFromInline' or public}}
package class PackageKlass {
package init() {} // expected-note *{{initializer 'init()' is not '@usableFromInline' or public}}
package private(set) var pkgVar: Double = 1.0
package func pkgFunc() {}
}
@usableFromInline
package class PackageKlassProto: PackageProto {
@usableFromInline
package init() {}
@usableFromInline
package var pkgVar = 1.0
package func pkgFunc() {}
}
@usableFromInline
package class PackageKlassForInline {
@usableFromInline
package init() {}
}
protocol InternalProto {
var internalVar: Double { get set }
func internalFunc()
}
// expected-note@+1 *{{class 'InternalKlass' is not '@usableFromInline' or public}}
class InternalKlass {
init() {} // expected-note *{{initializer 'init()' is not '@usableFromInline' or public}}
}
@usableFromInline
class InternalKlassProto: InternalProto {
@usableFromInline
init() {}
var internalVar = 1.0
func internalFunc() {}
}
@usableFromInline
class InternalKlassForInline {
@usableFromInline
init() {}
}
@inlinable
public func publicFunc() {
let a = PackageKlass()
// expected-error@-1 {{class 'PackageKlass' is package and cannot be referenced from an '@inlinable' function}}
// expected-error@-2 {{initializer 'init()' is package and cannot be referenced from an '@inlinable' function}}
let b = InternalKlass() // should error
// expected-error@-1 {{class 'InternalKlass' is internal and cannot be referenced from an '@inlinable' function}}
// expected-error@-2 {{initializer 'init()' is internal and cannot be referenced from an '@inlinable' function}}
let c = PackageKlassProto()
let d = InternalKlassProto()
let e = PackageKlassForInline()
let f = InternalKlassForInline()
print(a, b, c, d, e, f)
}
@inlinable
func internalFunc() {
let a = PackageKlass()
// expected-error@-1 {{class 'PackageKlass' is package and cannot be referenced from an '@inlinable' function}}
// expected-error@-2 {{initializer 'init()' is package and cannot be referenced from an '@inlinable' function}}
let b = InternalKlass()
// expected-error@-1 {{class 'InternalKlass' is internal and cannot be referenced from an '@inlinable' function}}
// expected-error@-2 {{initializer 'init()' is internal and cannot be referenced from an '@inlinable' function}}
let c = PackageKlassProto()
let d = InternalKlassProto()
let e = PackageKlassForInline()
let f = InternalKlassForInline()
print(a, b, c, d, e, f)
}
@inlinable
package func packageFunc() {
let a = PackageKlass()
// expected-error@-1 {{class 'PackageKlass' is package and cannot be referenced from an '@inlinable' function}}
// expected-error@-2 {{initializer 'init()' is package and cannot be referenced from an '@inlinable' function}}
let b = InternalKlass()
// expected-error@-1 {{class 'InternalKlass' is internal and cannot be referenced from an '@inlinable' function}}
// expected-error@-2 {{initializer 'init()' is internal and cannot be referenced from an '@inlinable' function}}
let c = PackageKlassProto()
let d = InternalKlassProto()
let e = PackageKlassForInline()
let f = InternalKlassForInline()
print(a, b, c, d, e, f)
}
//--- UtilsGood.swift
package protocol PackageProto {
var pkgVar: Double { get set }
func pkgFunc()
}
package class PackageKlass {
package init() {}
package private(set) var pkgVar: Double = 1.0
package func pkgFunc() {}
}
@usableFromInline
package class PackageKlassForInline {
@usableFromInline
package init() {}
}
class InternalKlass {
init() {}
}
@usableFromInline
class InternalKlassForInline {
@usableFromInline
init() {}
}
@inlinable
public func publicFunc() {
let x = PackageKlassForInline()
let y = InternalKlassForInline()
print(x, y)
}
@inlinable
func internalFunc() {
let x = PackageKlassForInline()
let y = InternalKlassForInline()
print(x, y)
}
@inlinable
package func packageFunc() {
let x = PackageKlassForInline()
let y = InternalKlassForInline()
print(x, y)
}
//--- LibOtherPackage.swift
import UtilsGood
@inlinable
public func libFunc() {
publicFunc()
packageFunc() // expected-error {{cannot find 'packageFunc' in scope}}
}
//--- LibSamePackage.swift
import UtilsGood
@inlinable
public func libFunc() {
publicFunc()
packageFunc() // OK
}