From baa02e0529c7a8020f7e12c29ad858b14e8f12f0 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. (cherry picked from commit e9ac803e941525cc170995468b11d8a55c5b5cf0) --- 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