Skip to content

Commit 7476970

Browse files
committed
Diagnose if lifetime dependence specifiers are not in the function result position
1 parent de3e20c commit 7476970

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7782,6 +7782,10 @@ ERROR(pack_iteration_where_clause_not_supported, none,
77827782
ERROR(lifetime_dependence_cannot_use_kind, none,
77837783
"invalid use of %0 lifetime dependence for %1 ownership",
77847784
(StringRef, StringRef))
7785+
ERROR(lifetime_dependence_only_on_function_method_init_result, none,
7786+
"lifetime dependence specifiers may only be used on result of "
7787+
"functions, methods, initializers",
7788+
())
77857789

77867790
#define UNDEFINE_DIAGNOSTIC_MACROS
77877791
#include "DefineDiagnosticMacros.h"

lib/Sema/TypeCheckType.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2148,6 +2148,8 @@ namespace {
21482148
TypeResolutionOptions options);
21492149
NeverNullType resolveResultDependsOnTypeRepr(ResultDependsOnTypeRepr *repr,
21502150
TypeResolutionOptions options);
2151+
NeverNullType resolveLifetimeDependentReturnTypeRepr(
2152+
LifetimeDependentReturnTypeRepr *repr, TypeResolutionOptions options);
21512153
NeverNullType resolveArrayType(ArrayTypeRepr *repr,
21522154
TypeResolutionOptions options);
21532155
NeverNullType resolveDictionaryType(DictionaryTypeRepr *repr,
@@ -2638,10 +2640,9 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
26382640
return resolveResultDependsOnTypeRepr(cast<ResultDependsOnTypeRepr>(repr),
26392641
options);
26402642

2641-
case TypeReprKind::LifetimeDependentReturn: {
2642-
auto lifetimeDependenceRepr = cast<LifetimeDependentReturnTypeRepr>(repr);
2643-
return resolveType(lifetimeDependenceRepr->getBase(), options);
2644-
}
2643+
case TypeReprKind::LifetimeDependentReturn:
2644+
return resolveLifetimeDependentReturnTypeRepr(
2645+
cast<LifetimeDependentReturnTypeRepr>(repr), options);
26452646
}
26462647
llvm_unreachable("all cases should be handled");
26472648
}
@@ -4605,6 +4606,18 @@ TypeResolver::resolveResultDependsOnTypeRepr(ResultDependsOnTypeRepr *repr,
46054606
return resolveType(repr->getBase(), options);
46064607
}
46074608

4609+
NeverNullType TypeResolver::resolveLifetimeDependentReturnTypeRepr(
4610+
LifetimeDependentReturnTypeRepr *repr, TypeResolutionOptions options) {
4611+
4612+
if (!options.is(TypeResolverContext::FunctionResult)) {
4613+
diagnoseInvalid(
4614+
repr, repr->getSpecifierLoc(),
4615+
diag::lifetime_dependence_only_on_function_method_init_result);
4616+
return ErrorType::get(getASTContext());
4617+
}
4618+
return resolveType(repr->getBase(), options);
4619+
}
4620+
46084621
NeverNullType
46094622
TypeResolver::resolveDictionaryType(DictionaryTypeRepr *repr,
46104623
TypeResolutionOptions options) {

test/Sema/explicit_lifetime_dependence_specifiers.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,11 @@ struct Wrapper : ~Escapable {
112112
return view
113113
}
114114
}
115+
116+
struct ArrayOfBufferView : ~Escapable {
117+
let arr: [BufferView]
118+
subscript(index: Int) -> _borrow(self) BufferView {
119+
return arr[index]
120+
}
121+
}
122+

0 commit comments

Comments
 (0)