@@ -5774,6 +5774,12 @@ bool CollectionElementContextualFailure::diagnoseAsError() {
5774
5774
auto eltType = getFromType ();
5775
5775
auto contextualType = getToType ();
5776
5776
5777
+ auto diagnoseSingleElement = [&](Diag<Type, Type> msg, Type eltType,
5778
+ Type contextualType) {
5779
+ auto diagnostic = emitDiagnostic (msg, eltType, contextualType);
5780
+ (void )trySequenceSubsequenceFixIts (diagnostic);
5781
+ };
5782
+
5777
5783
auto diagnoseAllOccurrences = [&](Diag<Type, Type> diagnostic) {
5778
5784
assert (AffectedElements.size () > 1 );
5779
5785
for (auto *element : AffectedElements) {
@@ -5790,16 +5796,16 @@ bool CollectionElementContextualFailure::diagnoseAsError() {
5790
5796
};
5791
5797
5792
5798
bool treatAsDictionary = false ;
5793
- Optional<InFlightDiagnostic> diagnostic;
5794
5799
if (auto *AE = getAsExpr<ArrayExpr>(anchor)) {
5795
5800
if (!(treatAsDictionary = isFixedToDictionary (AE))) {
5796
5801
if (AffectedElements.size () > 1 ) {
5797
5802
diagnoseAllOccurrences (diag::cannot_convert_array_element);
5798
5803
return true ;
5799
5804
}
5800
5805
5801
- diagnostic.emplace (emitDiagnostic (diag::cannot_convert_array_element,
5802
- eltType, contextualType));
5806
+ diagnoseSingleElement (diag::cannot_convert_array_element, eltType,
5807
+ contextualType);
5808
+ return true ;
5803
5809
}
5804
5810
}
5805
5811
@@ -5812,9 +5818,9 @@ bool CollectionElementContextualFailure::diagnoseAsError() {
5812
5818
return true ;
5813
5819
}
5814
5820
5815
- diagnostic. emplace ( emitDiagnostic (diag::cannot_convert_dict_key, eltType,
5816
- contextualType) );
5817
- break ;
5821
+ diagnoseSingleElement (diag::cannot_convert_dict_key, eltType,
5822
+ contextualType);
5823
+ return true ;
5818
5824
}
5819
5825
5820
5826
case 1 : { // value
@@ -5823,9 +5829,9 @@ bool CollectionElementContextualFailure::diagnoseAsError() {
5823
5829
return true ;
5824
5830
}
5825
5831
5826
- diagnostic. emplace ( emitDiagnostic ( diag::cannot_convert_dict_value,
5827
- eltType, contextualType) );
5828
- break ;
5832
+ diagnoseSingleElement ( diag::cannot_convert_dict_value, eltType ,
5833
+ contextualType);
5834
+ return true ;
5829
5835
}
5830
5836
5831
5837
default :
@@ -5841,25 +5847,22 @@ bool CollectionElementContextualFailure::diagnoseAsError() {
5841
5847
if ((purpose == ContextualTypePurpose::CTP_ForEachStmt ||
5842
5848
purpose == ContextualTypePurpose::CTP_ForEachSequence) &&
5843
5849
contextualType->hasUnresolvedType ()) {
5844
- diagnostic. emplace ( emitDiagnostic (
5850
+ auto diagnostic = emitDiagnostic (
5845
5851
(contextualType->is <TupleType>() && !eltType->is <TupleType>())
5846
5852
? diag::cannot_match_expr_tuple_pattern_with_nontuple_value
5847
5853
: diag::cannot_match_unresolved_expr_pattern_with_value,
5848
- eltType));
5854
+ eltType);
5855
+ (void )trySequenceSubsequenceFixIts (diagnostic);
5849
5856
} else {
5850
- diagnostic.emplace (
5851
- emitDiagnostic (contextualType->isExistentialType ()
5852
- ? diag::cannot_convert_sequence_element_protocol
5853
- : diag::cannot_convert_sequence_element_value,
5854
- eltType, contextualType));
5857
+ diagnoseSingleElement (contextualType->isExistentialType ()
5858
+ ? diag::cannot_convert_sequence_element_protocol
5859
+ : diag::cannot_convert_sequence_element_value,
5860
+ eltType, contextualType);
5855
5861
}
5862
+ return true ;
5856
5863
}
5857
5864
5858
- if (!diagnostic)
5859
- return false ;
5860
-
5861
- (void )trySequenceSubsequenceFixIts (*diagnostic);
5862
- return true ;
5865
+ return false ;
5863
5866
}
5864
5867
5865
5868
bool MissingContextualConformanceFailure::diagnoseAsError () {
0 commit comments