@@ -4768,6 +4768,21 @@ void ConstraintSystem::diagnoseFailureFor(SyntacticElementTarget target) {
4768
4768
return ;
4769
4769
}
4770
4770
4771
+ if (auto *wrappedVar = target.getAsUninitializedWrappedVar ()) {
4772
+ auto *outerWrapper = wrappedVar->getOutermostAttachedPropertyWrapper ();
4773
+ Type propertyType = wrappedVar->getInterfaceType ();
4774
+ Type wrapperType = outerWrapper->getType ();
4775
+
4776
+ // Emit the property wrapper fallback diagnostic
4777
+ wrappedVar->diagnose (diag::property_wrapper_incompatible_property,
4778
+ propertyType, wrapperType);
4779
+ if (auto nominal = wrapperType->getAnyNominal ()) {
4780
+ nominal->diagnose (diag::property_wrapper_declared_here,
4781
+ nominal->getName ());
4782
+ }
4783
+ return ;
4784
+ }
4785
+
4771
4786
if (auto expr = target.getAsExpr ()) {
4772
4787
if (auto *assignment = dyn_cast<AssignExpr>(expr)) {
4773
4788
if (isa<DiscardAssignmentExpr>(assignment->getDest ()))
@@ -4785,33 +4800,12 @@ void ConstraintSystem::diagnoseFailureFor(SyntacticElementTarget target) {
4785
4800
.highlight (closure->getSourceRange ());
4786
4801
return ;
4787
4802
}
4788
-
4789
- // If no one could find a problem with this expression or constraint system,
4790
- // then it must be well-formed... but is ambiguous. Handle this by
4791
- // diagnostic various cases that come up.
4792
- DE.diagnose (expr->getLoc (), diag::type_of_expression_is_ambiguous)
4793
- .highlight (expr->getSourceRange ());
4794
- } else if (auto *wrappedVar = target.getAsUninitializedWrappedVar ()) {
4795
- auto *outerWrapper = wrappedVar->getOutermostAttachedPropertyWrapper ();
4796
- Type propertyType = wrappedVar->getInterfaceType ();
4797
- Type wrapperType = outerWrapper->getType ();
4798
-
4799
- // Emit the property wrapper fallback diagnostic
4800
- wrappedVar->diagnose (diag::property_wrapper_incompatible_property,
4801
- propertyType, wrapperType);
4802
- if (auto nominal = wrapperType->getAnyNominal ()) {
4803
- nominal->diagnose (diag::property_wrapper_declared_here,
4804
- nominal->getName ());
4805
- }
4806
- } else if (target.getAsUninitializedVar ()) {
4807
- DE.diagnose (target.getLoc (), diag::failed_to_produce_diagnostic);
4808
- } else if (target.isForEachPreamble ()) {
4809
- DE.diagnose (target.getLoc (), diag::failed_to_produce_diagnostic);
4810
- } else {
4811
- // Emit a poor fallback message.
4812
- DE.diagnose (target.getAsFunction ()->getLoc (),
4813
- diag::failed_to_produce_diagnostic);
4814
4803
}
4804
+
4805
+ // Emit a poor fallback message.
4806
+ auto diag = DE.diagnose (target.getLoc (), diag::failed_to_produce_diagnostic);
4807
+ if (auto *expr = target.getAsExpr ())
4808
+ diag.highlight (expr->getSourceRange ());
4815
4809
}
4816
4810
4817
4811
bool ConstraintSystem::isDeclUnavailable (const Decl *D,
0 commit comments