mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[Sema] Improve diagnostic when @usableFromInline is applied to a declaration without a name (i.e. accessor/init)
This commit is contained in:
@@ -6904,8 +6904,8 @@ ERROR(frozen_attr_on_internal_type,
|
||||
|
||||
ERROR(usable_from_inline_attr_with_explicit_access,
|
||||
none, "'@usableFromInline' attribute can only be applied to internal or package "
|
||||
"declarations, but %0 is %select{private|fileprivate|%error|package|public|open}1",
|
||||
(DeclName, AccessLevel))
|
||||
"declarations, but %kind0 is %select{private|fileprivate|%error|package|public|open}1",
|
||||
(const ValueDecl *, AccessLevel))
|
||||
|
||||
WARNING(inlinable_implies_usable_from_inline,none,
|
||||
"'@usableFromInline' attribute has no effect on '@inlinable' %kind0",
|
||||
|
||||
@@ -3273,7 +3273,7 @@ void AttributeChecker::visitUsableFromInlineAttr(UsableFromInlineAttr *attr) {
|
||||
VD->getFormalAccess() != AccessLevel::Package) {
|
||||
diagnoseAndRemoveAttr(attr,
|
||||
diag::usable_from_inline_attr_with_explicit_access,
|
||||
VD->getName(), VD->getFormalAccess());
|
||||
VD, VD->getFormalAccess());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
// RUN: %target-typecheck-verify-swift -enable-testing -swift-version 4 -disable-objc-attr-requires-foundation-module -enable-objc-interop
|
||||
|
||||
@usableFromInline private func privateVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'privateVersioned()' is private}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'privateVersioned()' is private}}
|
||||
|
||||
@usableFromInline fileprivate func fileprivateVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'fileprivateVersioned()' is fileprivate}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'fileprivateVersioned()' is fileprivate}}
|
||||
|
||||
@usableFromInline internal func internalVersioned() {}
|
||||
// OK
|
||||
@@ -14,11 +14,11 @@
|
||||
// OK
|
||||
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'publicVersioned()' is public}}
|
||||
|
||||
internal class InternalClass {
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but instance method 'publicVersioned()' is public}}
|
||||
}
|
||||
|
||||
fileprivate class filePrivateClass {
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
// RUN: %target-typecheck-verify-swift -enable-testing -swift-version 4.2 -disable-objc-attr-requires-foundation-module -enable-objc-interop
|
||||
|
||||
@usableFromInline private func privateVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'privateVersioned()' is private}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'privateVersioned()' is private}}
|
||||
|
||||
@usableFromInline fileprivate func fileprivateVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'fileprivateVersioned()' is fileprivate}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'fileprivateVersioned()' is fileprivate}}
|
||||
|
||||
@usableFromInline internal func internalVersioned() {}
|
||||
// OK
|
||||
@@ -14,12 +14,12 @@
|
||||
// OK
|
||||
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'publicVersioned()' is public}}
|
||||
|
||||
internal class InternalClass {
|
||||
// expected-note@-1 2{{type declared here}}
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but instance method 'publicVersioned()' is public}}
|
||||
}
|
||||
|
||||
fileprivate class filePrivateClass {
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
// RUN: %target-typecheck-verify-swift -swift-version 5 -disable-objc-attr-requires-foundation-module -enable-objc-interop -enable-testing -package-name myPkg
|
||||
|
||||
@usableFromInline private func privateVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'privateVersioned()' is private}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'privateVersioned()' is private}}
|
||||
|
||||
@usableFromInline fileprivate func fileprivateVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'fileprivateVersioned()' is fileprivate}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'fileprivateVersioned()' is fileprivate}}
|
||||
|
||||
@usableFromInline internal func internalVersioned() {}
|
||||
// OK
|
||||
@@ -17,7 +17,7 @@
|
||||
// OK
|
||||
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but global function 'publicVersioned()' is public}}
|
||||
|
||||
// expected-note@+1 3{{global function 'internalFunc()' is not '@usableFromInline' or public}}
|
||||
internal func internalFunc() {}
|
||||
@@ -55,13 +55,13 @@ package func packageInlinableFunc() {
|
||||
package class PackageClass {
|
||||
// expected-note@-1 *{{type declared here}}
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but instance method 'publicVersioned()' is public}}
|
||||
}
|
||||
|
||||
internal class InternalClass {
|
||||
// expected-note@-1 2{{type declared here}}
|
||||
@usableFromInline public func publicVersioned() {}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but 'publicVersioned()' is public}}
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but instance method 'publicVersioned()' is public}}
|
||||
}
|
||||
|
||||
fileprivate class filePrivateClass {
|
||||
@@ -334,3 +334,21 @@ public struct TestGenericSubscripts {
|
||||
@usableFromInline package func pkgNonGenericWhereClause() where T : PackageProtocol {}
|
||||
// expected-error@-1 {{type referenced from a generic requirement of a '@usableFromInline' instance method must be '@usableFromInline' or public}}
|
||||
}
|
||||
|
||||
public struct IncorrectInitUse {
|
||||
public var x: Int {
|
||||
@usableFromInline
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but getter for property 'x' is public}}
|
||||
get { 0 }
|
||||
|
||||
@usableFromInline
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but setter for property 'x' is public}}
|
||||
set { }
|
||||
}
|
||||
|
||||
@usableFromInline
|
||||
// expected-error@-1 {{'@usableFromInline' attribute can only be applied to internal or package declarations, but initializer 'init(x:)' is public}}
|
||||
public init(x: Int) {
|
||||
self.x = x
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user