@@ -4768,6 +4768,21 @@ void ConstraintSystem::diagnoseFailureFor(SyntacticElementTarget target) {
47684768 return ;
47694769 }
47704770
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+
47714786 if (auto expr = target.getAsExpr ()) {
47724787 if (auto *assignment = dyn_cast<AssignExpr>(expr)) {
47734788 if (isa<DiscardAssignmentExpr>(assignment->getDest ()))
@@ -4785,33 +4800,12 @@ void ConstraintSystem::diagnoseFailureFor(SyntacticElementTarget target) {
47854800 .highlight (closure->getSourceRange ());
47864801 return ;
47874802 }
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);
48144803 }
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 ());
48154809}
48164810
48174811bool ConstraintSystem::isDeclUnavailable (const Decl *D,
0 commit comments