Skip to content

Commit ea237d5

Browse files
MaxDesiatovAzoy
authored andcommitted
Merge pull request #81104 from Azoy/value-generic-namelookup-warning
[AST] Temporarily downgrade value generic redeclaration to warning
1 parent 12919a2 commit ea237d5

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

include/swift/AST/Decl.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff 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.

lib/AST/Decl.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff 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

test/Sema/value_generics.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func testC4<let T: Int>(with c: C<T, T>) {
123123
struct D<let N: Int & P> {} // expected-error {{non-protocol, non-class type 'Int' cannot be used within a protocol-constrained type}}
124124

125125
struct 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

187187
struct 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

191191
typealias J = E<Int, 123>.b // expected-error {{static property 'b' is not a member type of 'E<Int, 123>'}}

0 commit comments

Comments
 (0)