Skip to content

Commit 472937e

Browse files
authored
Merge pull request #85591 from kathygray-pl/kathy/diagnosticProperty
[Diagnostics] Increase possibility for missed property diagnostic
2 parents 747234c + fde49b8 commit 472937e

14 files changed

+125
-43
lines changed

lib/Sema/CSRanking.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ bool ConstraintSystem::worseThanBestSolution() const {
174174

175175
if (isDebugMode()) {
176176
llvm::errs().indent(solverState->getCurrentIndent())
177-
<< "(solution is worse than the best solution)\n";
177+
<< "(solution " << CurrentScore << " is worse than the best solution "
178+
<< solverState->BestScore <<")\n";
178179
}
179180

180181
return true;

lib/Sema/CSSimplify.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9257,6 +9257,9 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyConformsToConstraint(
92579257
req->is<LocatorPathElt::TypeParameterRequirement>()) {
92589258
auto *memberLoc = getConstraintLocator(anchor, path.front());
92599259

9260+
if (hasFixFor(memberLoc))
9261+
return SolutionKind::Solved;
9262+
92609263
auto signature = path[path.size() - 2]
92619264
.castTo<LocatorPathElt::OpenedGeneric>()
92629265
.getSignature();
@@ -10677,7 +10680,6 @@ performMemberLookup(ConstraintKind constraintKind, DeclNameRef memberName,
1067710680
candidate,
1067810681
MemberLookupResult::UR_InvalidStaticMemberOnProtocolMetatype);
1067910682
}
10680-
1068110683
return;
1068210684
} else {
1068310685
if (!hasStaticMembers) {
@@ -11625,8 +11627,7 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyMemberConstraint(
1162511627
alreadyDiagnosed, locator);
1162611628

1162711629
auto instanceTy = baseObjTy->getMetatypeInstanceType();
11628-
11629-
auto impact = 4;
11630+
auto impact = 2;
1163011631
// Impact is higher if the base type is any function type
1163111632
// because function types can't have any members other than self
1163211633
if (instanceTy->is<AnyFunctionType>()) {
@@ -11654,10 +11655,10 @@ ConstraintSystem::SolutionKind ConstraintSystem::simplifyMemberConstraint(
1165411655
}
1165511656
}
1165611657

11657-
// Increasing the impact for missing member in any argument position so
11658-
// it doesn't affect situations where there are another fixes involved.
11658+
// Increasing the impact for missing member in any argument position
11659+
// which may be less likely than other potential mistakes
1165911660
if (getArgumentLocator(anchorExpr))
11660-
impact += 5;
11661+
impact += 1;
1166111662
}
1166211663

1166311664
if (recordFix(fix, impact))

test/Concurrency/async_overload_filtering.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ var a: String? = nil
2222
// CHECK: overload set choice binding $T0 := {{.*}}
2323
// CHECK-NEXT: (considering: ({{.*}}) -> {{.*}} applicable fn {{.*}}
2424
// CHECK: increasing 'sync-in-asynchronous' score by 1
25-
// CHECK: solution is worse than the best solution
25+
// CHECK: solution {{.*}} is worse than the best solution {{.*}}
2626

2727
filter_async {
2828
Obj()

test/Constraints/enum_cases.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,13 @@ enum CompassPoint {
182182
}
183183

184184
func isNorth(c : CompassPoint) -> Bool {
185-
// expected-error@+1{{member 'North' expects argument of type 'Int'}}
185+
// FIXME: After improving property lookup fix, this message is not selected. Separate debug to reinstate {{member 'North' expects argument of type 'Int'}}
186186
return c == .North // expected-error {{binary operator '==' cannot be applied to two 'CompassPoint' operands}}
187187
// expected-note@-1 {{binary operator '==' cannot be synthesized for enums with associated values}}
188188
}
189189

190190
func isNorth2(c : CompassPoint) -> Bool {
191-
// expected-error@+1{{member 'North' expects argument of type 'Int'}}
191+
// FIXME: {{member 'North' expects argument of type 'Int'}}
192192
return .North == c // expected-error {{binary operator '==' cannot be applied to two 'CompassPoint' operands}}
193193
// expected-note@-1 {{binary operator '==' cannot be synthesized for enums with associated values}}
194194
}

test/Constraints/static_members_on_protocol_in_generic_context.swift

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ test_combo(.genericFn(42)) // expected-error {{global function 'test_combo' requ
177177

178178
extension P { // expected-note 13 {{missing same-type requirement on 'Self'}} {{12-12= where Self == <#Type#>}}
179179
static func generic<T>(_: T) -> T { fatalError() }
180-
static func genericWithReqs<T: Collection, Q>(_: T) -> Q where T.Element == Q { // expected-note 3 {{required by static method 'genericWithReqs' where 'T' = '()'}}
180+
static func genericWithReqs<T: Collection>(_: T) -> Q where T.Element == Q { // expected-note {{required by static method 'genericWithReqs' where 'T' = '()'}}
181181
fatalError()
182182
}
183183
}
@@ -213,10 +213,12 @@ _ = P.generic(S()).other // expected-error {{static member 'generic' cannot be u
213213
_ = P.generic(G<Int>()) // expected-error {{static member 'generic' cannot be used on protocol metatype '(any P).Type'}}
214214
_ = P.genericWithReqs([S()]) // expected-error {{static member 'genericWithReqs' cannot be used on protocol metatype '(any P).Type'}}
215215
_ = P.genericWithReqs([42])
216-
// expected-error@-1 {{static member 'genericWithReqs' cannot be used on protocol metatype '(any P).Type'}}
216+
// expected-error@-1 {{cannot convert value of type 'Int' to expected element type 'any Q'}}
217+
// expected-error@-2 {{static member 'genericWithReqs' cannot be used on protocol metatype '(any P).Type'}}
217218
_ = P.genericWithReqs(())
218-
// expected-error@-1 {{type '()' cannot conform to 'Collection'}} expected-note@-1 {{only concrete types such as structs, enums and classes can conform to protocols}}
219+
// expected-error@-1 {{type '()' cannot conform to 'Collection'}}
219220
// expected-error@-2 {{static member 'genericWithReqs' cannot be used on protocol metatype '(any P).Type'}}
221+
// expected-note@-3 {{only concrete types such as structs, enums and classes can conform to protocols}}
220222
_ = P[q: ""]
221223
// expected-error@-1 {{static member 'subscript' cannot be used on protocol metatype '(any P).Type'}}
222224
_ = P[q: ""].other
@@ -227,6 +229,8 @@ test(.doesntExist) // expected-error {{type 'P' has no member 'doesntExist'}}
227229
test(.doesnt.exist()) // expected-error {{type 'P' has no member 'doesnt'}}
228230
test(.invalidProp)
229231
// expected-error@-1 {{contextual member reference to static property 'invalidProp' requires 'Self' constraint in the protocol extension}}
232+
test(.property.doesntExist)
233+
// expected-error@-1 {{value of type 'S' has no member 'doesntExist'}}
230234
test(.invalidProp.other)
231235
// expected-error@-1 {{contextual member reference to static property 'invalidProp' requires 'Self' constraint in the protocol extension}}
232236
// expected-error@-2 {{value of type 'Int' has no member 'other'}}
@@ -243,30 +247,38 @@ test(.generic(42).other)
243247
test(.generic(S())) // expected-error {{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
244248
test(.generic(G<Int>())) // expected-error {{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
245249
test(.genericWithReqs([S()])) // expected-error {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
250+
test(.genericWithReqs([S()]).doesntExist) // expected-error {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
251+
// expected-error@-1 {{value of type 'any Q' has no member 'doesntExist'}}
246252
test(.genericWithReqs([42]))
247253
// expected-error@-1 {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
254+
// expected-error@-2 {{cannot convert value of type 'Int' to expected element type 'any Q'}}
248255
test(.genericWithReqs(()))
249-
// expected-error@-1 {{type '()' cannot conform to 'Collection'}}
250-
// expected-note@-2 {{only concrete types such as structs, enums and classes can conform to protocols}}
251-
// expected-error@-3 {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
256+
// expected-error@-1 {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
252257

253258
test_combo(.doesntExist) // expected-error {{reference to member 'doesntExist' cannot be resolved without a contextual type}}
254259
test_combo(.doesnt.exist()) // expected-error {{reference to member 'doesnt' cannot be resolved without a contextual type}}
255260
test_combo(.invalidProp)
256261
// expected-error@-1 {{contextual member reference to static property 'invalidProp' requires 'Self' constraint in the protocol extension}}
262+
test_combo(.invalidProp.doesntExist) //FIXME: Requires protocol conformance fix for expected two messages below
263+
// expected-error@-1{{type 'Q' has no member 'invalidProp'}}
264+
// {{contextual member reference to static property 'invalidProp' requires 'Self' constraint in the protocol extension}}
265+
// {{value of type 'Int' has no member 'doesntExist'}}
257266
test_combo(.invalidMethod())
258-
// expected-error@-1 {{contextual member reference to static method 'invalidMethod()' requires 'Self' constraint in the protocol extension}}
267+
// expected-error@-1{{contextual member reference to static method 'invalidMethod()' requires 'Self' constraint in the protocol extension}}
259268
test_combo(.generic(42))
260-
// expected-error@-1 {{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
261-
test_combo(.generic(S())) // expected-error {{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
262-
test_combo(.generic(G<Int>())) // expected-error {{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
263-
test_combo(.genericWithReqs([S()])) // expected-error {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
264-
test_combo(.genericWithReqs([42]))
265-
// expected-error@-1 {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
269+
// expected-error@-1{{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
270+
test_combo(.generic(S()))
271+
// expected-error@-1{{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
272+
test_combo(.generic(G<Int>()))
273+
//expected-error@-1 {{contextual member reference to static method 'generic' requires 'Self' constraint in the protocol extension}}
274+
test_combo(.genericWithReqs([S()]))
275+
// expected-error@-1{{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
276+
test_combo(.genericWithReqs([42])) //FIXME: Requires protocol conformance fix for expected two messages below
277+
// expected-error@-1{{failed to produce diagnostic for expression}}
278+
// {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
279+
// {{cannot convert value of type 'Int' to expected element type 'any Q'}}
266280
test_combo(.genericWithReqs(()))
267-
// expected-error@-1 {{type '()' cannot conform to 'Collection'}}
268-
// expected-note@-2 {{only concrete types such as structs, enums and classes can conform to protocols}}
269-
// expected-error@-3 {{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
281+
// expected-error@-1{{contextual member reference to static method 'genericWithReqs' requires 'Self' constraint in the protocol extension}}
270282

271283
protocol TestWithAssoc {
272284
associatedtype U
@@ -381,4 +393,4 @@ test(.instanceProp)
381393
// expected-error@-1 {{instance member 'instanceProp' cannot be used on type 'P'}}
382394
test(.instanceProp2)
383395
// expected-error@-1 {{instance member 'instanceProp2' cannot be used on type 'P'}}
384-
// expected-error@-2 {{property 'instanceProp2' requires the types 'Self' and 'S' be equivalent}}
396+
// expected-error@-2 {{property 'instanceProp2' requires the types 'Self' and 'S' be equivalent}}

test/IDE/complete_closure_ambiguity.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ foo {
2626

2727
// CONSTRAINTS: attempting disjunction choice {{.*}}:12:6
2828
// CONSTRAINTS: increasing 'disfavored overload' score
29-
// CONSTRAINTS: solution is worse than the best solution
29+
// CONSTRAINTS: solution {{.*}} is worse than the best solution {{.*}}
3030

3131
// CONSTRAINTS-NOT-NOT: increasing 'hole'
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
func example(x: Int, regions: [Int]) {
4+
let matchingRegion =
5+
regions.first { region in x + region.bogusProperty }
6+
// expected-error@-1 {{value of type 'Int' has no member 'bogusProperty'}}
7+
}
8+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// RUN: %target-typecheck-verify-swift -target %target-cpu-apple-macosx10.15 -swift-version 5
2+
// REQUIRES: objc_interop
3+
// REQUIRES: OS=macosx
4+
//
5+
6+
import SwiftUI
7+
struct ContentView: View {
8+
var foos: [F]
9+
10+
var body: some View {
11+
ForEach(foos) { foo in
12+
let name = foo.bat //expected-error{{value of type 'F' has no member 'bat'}}
13+
}
14+
}
15+
}
16+
17+
struct F: Identifiable, Hashable {
18+
var id: String { bar }
19+
var bar: String // expected-note {{'bar' declared here}}
20+
}

validation-test/Sema/SwiftUI/rdar84580119.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ extension EnvironmentValues {
1414
var myHorizontalAlignment: AlignmentID? {
1515
get { fatalError() }
1616
set { self[\.MyHorizontalAlignmentEnvironmentKey.self] = newValue }
17-
// expected-error@-1 {{subscript 'subscript(_:)' requires that 'any AlignmentID' be a class type}}
18-
// expected-error@-2 {{cannot infer key path type from context; consider explicitly specifying a root type}}
17+
// expected-error@-1 {{value of type 'EnvironmentValues' has no member 'MyHorizontalAlignmentEnvironmentKey'}}
18+
// expected-error@-2 {{missing argument label 'keyPath:' in subscript}}
1919
}
2020
}
2121

validation-test/Sema/SwiftUI/too_complex_source_location.swift

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-typecheck-verify-swift -target %target-cpu-apple-macosx10.15 -swift-version 5
1+
// RUN: %target-typecheck-verify-swift -verify-ignore-unrelated -target %target-cpu-apple-macosx10.15 -swift-version 5
22
// REQUIRES: objc_interop
33
// REQUIRES: OS=macosx
44

@@ -22,17 +22,20 @@ struct ContentView: View {
2222

2323
var body: some View {
2424
ScrollView {
25+
VStack {
2526
VStack {
26-
Picker(selection: $selection) {
27-
ForEach(["a", "b", "c"], id: \.self) {
28-
Text($0) // expected-error {{reasonable time}}
29-
.foregroundStyl(.red) // Typo is here
30-
}
31-
} label: {
27+
Picker(selection: $selection) {
28+
ForEach(["a", "b", "c"], id: \.self) {
29+
Text($0) // expected-error {{ reasonable time}}
30+
.foregroundStyl(.red) // Typo is here
3231
}
33-
.pickerStyle(.segmented)
32+
} label: {
33+
}
34+
.pickerStyle(.segmented)
3435
}
35-
.padding(.horizontal)
36+
.padding(.vertical)
37+
}
38+
.padding(.horizontal)
3639
}
3740
.onChange(of: a) { oldValue, newValue in
3841
}

0 commit comments

Comments
 (0)