From e9ac803e941525cc170995468b11d8a55c5b5cf0 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Sun, 27 Apr 2025 22:34:16 -0700 Subject: [PATCH] LifetimeDependence: fix a type checker crash on implicit init When the type checker diagnoses an error on an implicit initializer, return immediately before handling its parameter to avoid an assert. --- lib/AST/LifetimeDependence.cpp | 2 +- test/Sema/lifetime_depend_infer.swift | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/AST/LifetimeDependence.cpp b/lib/AST/LifetimeDependence.cpp index 59f0531fe3d54..a4014eca99545 100644 --- a/lib/AST/LifetimeDependence.cpp +++ b/lib/AST/LifetimeDependence.cpp @@ -962,7 +962,7 @@ class LifetimeDependenceChecker { diagnose(returnLoc, diag::lifetime_dependence_cannot_infer_scope_ownership, param->getParameterName().str(), diagnosticQualifier()); - continue; + return; } targetDeps = std::move(targetDeps).add(paramIndex, *kind); } diff --git a/test/Sema/lifetime_depend_infer.swift b/test/Sema/lifetime_depend_infer.swift index ede6a1a2ca0a9..10876e5cf023c 100644 --- a/test/Sema/lifetime_depend_infer.swift +++ b/test/Sema/lifetime_depend_infer.swift @@ -168,6 +168,12 @@ struct EscapableNonTrivialSelf { // (for initializers and stand-alone functions) // ============================================================================= +// An implicit initializer illegally consumes its nontrivial parameter. +public struct NonescapableImplicitInitializer: ~Escapable { + // expected-error @-1{{cannot borrow the lifetime of 'c', which has consuming ownership on an implicit initializer}} + var c: C +} + struct NonescapableInitializers: ~Escapable { var c: C