Skip to content

Commit 74d5ee2

Browse files
committed
[Embedded] Downgrade type-checker error about non-final generic class methods to a warning
The existing SIL-level diagnostic for this check only triggers when the type is actually used, while the type-checker version is more eager. Stage in the stricter check as a warning and we'll clamp down on things later.
1 parent ade6e55 commit 74d5ee2

File tree

3 files changed

+11
-11
lines changed

3 files changed

+11
-11
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8612,9 +8612,10 @@ GROUPED_ERROR(weak_unowned_in_embedded_swift, EmbeddedRestrictions, none,
86128612
GROUPED_WARNING(untyped_throws_in_embedded_swift, EmbeddedRestrictions,
86138613
DefaultIgnore,
86148614
"untyped throws is not available in Embedded Swift; add a thrown error type with '(type)'", ())
8615-
GROUPED_ERROR(generic_nonfinal_in_embedded_swift, EmbeddedRestrictions, none,
8616-
"generic %kind0 in a class %select{must be 'final'|cannot be 'required'}1 in Embedded Swift",
8617-
(const Decl *, bool))
8615+
GROUPED_WARNING(generic_nonfinal_in_embedded_swift, EmbeddedRestrictions,
8616+
DefaultIgnore,
8617+
"generic %kind0 in a class %select{must be 'final'|cannot be 'required'}1 in Embedded Swift",
8618+
(const Decl *, bool))
86188619
GROUPED_WARNING(use_generic_member_of_existential_in_embedded_swift,
86198620
EmbeddedRestrictions, DefaultIgnore,
86208621
"cannot use generic %kind0 on a value of type %1 in Embedded Swift",

test/embedded/classes-non-final-method-no-stdlib.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
// REQUIRES: swift_feature_Embedded
55

66
public class MyClass {
7-
public func foo<T>(t: T) { } // expected-error {{generic instance method 'foo(t:)' in a class must be 'final' in Embedded Swift}}
7+
public func foo<T>(t: T) { } // expected-warning {{generic instance method 'foo(t:)' in a class must be 'final' in Embedded Swift}}
8+
// expected-error@-1{{classes cannot have a non-final, generic method 'foo(t:)' in embedded Swift}}
89
public func bar() { }
910
}
1011

@@ -24,7 +25,8 @@ func testit2() -> C2<S> {
2425
}
2526

2627
open class C3<X> {
27-
public func foo<T>(t: T) {} // expected-error {{generic instance method 'foo(t:)' in a class must be 'final' in Embedded Swift}}
28+
public func foo<T>(t: T) {} // expected-warning {{generic instance method 'foo(t:)' in a class must be 'final' in Embedded Swift}}
29+
// expected-error@-1{{classes cannot have a non-final, generic method 'foo(t:)' in embedded Swift}}
2830
}
2931

3032
func testit3() -> C3<S> {

test/embedded/restrictions.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,15 @@ public struct MyStruct {
7171
protocol P { }
7272

7373
class MyGenericClass<T> {
74-
func f<U>(value: U) { } // expected-nonembedded-warning{{generic instance method 'f(value:)' in a class must be 'final' in Embedded Swift}}
75-
// expected-embedded-error@-1{{generic instance method 'f(value:)' in a class must be 'final' in Embedded Swift}}
74+
func f<U>(value: U) { } // expected-warning{{generic instance method 'f(value:)' in a class must be 'final' in Embedded Swift}}
7675
func g() { }
77-
class func h() where T: P { } // expected-nonembedded-warning{{generic class method 'h()' in a class must be 'final' in Embedded Swift}}
78-
// expected-embedded-error@-1{{generic class method 'h()' in a class must be 'final' in Embedded Swift}}
76+
class func h() where T: P { } // expected-warning{{generic class method 'h()' in a class must be 'final' in Embedded Swift}}
7977

8078
init<U>(value: U) { } // okay, can be directly called
8179

8280
required init() { } // non-generic is okay
8381

84-
required init<V>(something: V) { } // expected-nonembedded-warning{{generic initializer 'init(something:)' in a class cannot be 'required' in Embedded Swift}}
85-
// expected-embedded-error@-1{{generic initializer 'init(something:)' in a class cannot be 'required' in Embedded Swift}}
82+
required init<V>(something: V) { } // expected-warning{{generic initializer 'init(something:)' in a class cannot be 'required' in Embedded Swift}}
8683
}
8784

8885
// ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)