File tree Expand file tree Collapse file tree 3 files changed +17
-4
lines changed Expand file tree Collapse file tree 3 files changed +17
-4
lines changed Original file line number Diff line number Diff line change @@ -310,6 +310,9 @@ struct OverloadSignature {
310310 // / Whether this is a macro.
311311 unsigned IsMacro : 1 ;
312312
313+ // / Whether this is a generic argument.
314+ unsigned IsGenericArg : 1 ;
315+
313316 // / Whether this signature is part of a protocol extension.
314317 unsigned InProtocolExtension : 1 ;
315318
@@ -323,8 +326,10 @@ struct OverloadSignature {
323326 OverloadSignature ()
324327 : UnaryOperator(UnaryOperatorKind::None), IsInstanceMember(false ),
325328 IsVariable (false ), IsFunction(false ), IsAsyncFunction(false ),
326- IsDistributed(false ), InProtocolExtension(false ),
327- InExtensionOfGenericType(false ), HasOpaqueReturnType(false ) { }
329+ IsDistributed(false ), IsEnumElement(false ), IsNominal(false ),
330+ IsTypeAlias(false ), IsMacro(false ), IsGenericArg(false ),
331+ InProtocolExtension(false ), InExtensionOfGenericType(false ),
332+ HasOpaqueReturnType(false ) { }
328333};
329334
330335// / Determine whether two overload signatures conflict.
Original file line number Diff line number Diff line change @@ -3856,6 +3856,13 @@ bool swift::conflicting(ASTContext &ctx,
38563856 if (sig1.IsFunction != sig2.IsFunction )
38573857 return true ;
38583858
3859+ // Gracefully handle the case where value generic arguments were introduced
3860+ // as a conflicting value with static variables of the same name.
3861+ if (sig1.IsGenericArg != sig2.IsGenericArg ) {
3862+ *wouldConflictInSwift5 = true ;
3863+ return true ;
3864+ }
3865+
38593866 // Variables always conflict with non-variables with the same signature.
38603867 // (e.g variables with zero argument functions, variables with type
38613868 // declarations)
@@ -4034,6 +4041,7 @@ OverloadSignature ValueDecl::getOverloadSignature() const {
40344041 signature.IsNominal = isa<NominalTypeDecl>(this );
40354042 signature.IsTypeAlias = isa<TypeAliasDecl>(this );
40364043 signature.IsMacro = isa<MacroDecl>(this );
4044+ signature.IsGenericArg = isa<GenericTypeParamDecl>(this );
40374045 signature.HasOpaqueReturnType =
40384046 !signature.IsVariable && (bool )getOpaqueResultTypeDecl ();
40394047
Original file line number Diff line number Diff line change @@ -123,7 +123,7 @@ func testC4<let T: Int>(with c: C<T, T>) {
123123struct D < let N: Int & P > { } // expected-error {{non-protocol, non-class type 'Int' cannot be used within a protocol-constrained type}}
124124
125125struct E < A, let b: Int > { // expected-note {{'b' previously declared here}}
126- static var b : Int { // expected-error {{invalid redeclaration of 'b'}}
126+ static var b : Int { // expected-warning {{redeclaration of 'b' is deprecated and will be an error in Swift 5 }}
127127 // expected-note@-1 {{'b' declared here}}
128128 123
129129 }
@@ -185,7 +185,7 @@ func testTypeOf2<let c: Int>(_: E<Int, c>.Type) -> Int {
185185}
186186
187187struct H < let I: Int > { // expected-note {{'I' previously declared here}}
188- struct I { } // expected-error {{invalid redeclaration of 'I'}}
188+ struct I { } // expected-warning {{redeclaration of 'I' is deprecated and will be an error in Swift 5 }}
189189}
190190
191191typealias J = E < Int , 123 > . b // expected-error {{static property 'b' is not a member type of 'E<Int, 123>'}}
You can’t perform that action at this time.
0 commit comments