Skip to content

Commit 4a8fdb8

Browse files
committed
Push NeverNullType Into The Leaves of Type Resolution
This ought to afford more specific traces when a null type is actually propagated out of the branches. As an added benefit, we no longer have to check for the null type when making recursive calls into type resolution and will now recieve a compile-time error when such a comparison is attempted.
1 parent 07fafa3 commit 4a8fdb8

File tree

1 file changed

+94
-93
lines changed

1 file changed

+94
-93
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 94 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,24 +1758,24 @@ namespace {
17581758
return diags.diagnose(std::forward<ArgTypes>(Args)...);
17591759
}
17601760

1761-
Type resolveAttributedType(AttributedTypeRepr *repr,
1762-
TypeResolutionOptions options);
1763-
Type resolveAttributedType(TypeAttributes &attrs, TypeRepr *repr,
1764-
TypeResolutionOptions options);
1765-
Type resolveASTFunctionType(FunctionTypeRepr *repr,
1766-
TypeResolutionOptions options,
1767-
AnyFunctionType::Representation representation
1768-
= AnyFunctionType::Representation::Swift,
1769-
bool noescape = false,
1770-
const clang::Type *parsedClangFunctionType
1771-
= nullptr,
1772-
DifferentiabilityKind diffKind
1773-
= DifferentiabilityKind::NonDifferentiable);
1761+
NeverNullType resolveAttributedType(AttributedTypeRepr *repr,
1762+
TypeResolutionOptions options);
1763+
NeverNullType resolveAttributedType(TypeAttributes &attrs, TypeRepr *repr,
1764+
TypeResolutionOptions options);
1765+
NeverNullType
1766+
resolveASTFunctionType(FunctionTypeRepr *repr,
1767+
TypeResolutionOptions options,
1768+
AnyFunctionType::Representation representation =
1769+
AnyFunctionType::Representation::Swift,
1770+
bool noescape = false,
1771+
const clang::Type *parsedClangFunctionType = nullptr,
1772+
DifferentiabilityKind diffKind =
1773+
DifferentiabilityKind::NonDifferentiable);
17741774
SmallVector<AnyFunctionType::Param, 8> resolveASTFunctionTypeParams(
17751775
TupleTypeRepr *inputRepr, TypeResolutionOptions options,
17761776
bool requiresMappingOut, DifferentiabilityKind diffKind);
17771777

1778-
Type resolveSILFunctionType(
1778+
NeverNullType resolveSILFunctionType(
17791779
FunctionTypeRepr *repr, TypeResolutionOptions options,
17801780
SILCoroutineKind coroutineKind = SILCoroutineKind::None,
17811781
SILFunctionType::ExtInfoBuilder extInfoBuilder =
@@ -1794,40 +1794,40 @@ namespace {
17941794
SmallVectorImpl<SILYieldInfo> &yields,
17951795
SmallVectorImpl<SILResultInfo> &results,
17961796
Optional<SILResultInfo> &errorResult);
1797-
Type resolveIdentifierType(IdentTypeRepr *IdType,
1798-
TypeResolutionOptions options);
1799-
Type resolveSpecifierTypeRepr(SpecifierTypeRepr *repr,
1800-
TypeResolutionOptions options);
1801-
Type resolveArrayType(ArrayTypeRepr *repr,
1802-
TypeResolutionOptions options);
1803-
Type resolveDictionaryType(DictionaryTypeRepr *repr,
1804-
TypeResolutionOptions options);
1805-
Type resolveOptionalType(OptionalTypeRepr *repr,
1806-
TypeResolutionOptions options);
1807-
Type resolveImplicitlyUnwrappedOptionalType(ImplicitlyUnwrappedOptionalTypeRepr *repr,
1808-
TypeResolutionOptions options,
1809-
bool isDirect);
1810-
Type resolveTupleType(TupleTypeRepr *repr,
1811-
TypeResolutionOptions options);
1812-
Type resolveCompositionType(CompositionTypeRepr *repr,
1813-
TypeResolutionOptions options);
1814-
Type resolveMetatypeType(MetatypeTypeRepr *repr,
1815-
TypeResolutionOptions options);
1816-
Type resolveProtocolType(ProtocolTypeRepr *repr,
1817-
TypeResolutionOptions options);
1818-
Type resolveSILBoxType(SILBoxTypeRepr *repr,
1819-
TypeResolutionOptions options);
1820-
1821-
Type buildMetatypeType(MetatypeTypeRepr *repr,
1822-
Type instanceType,
1823-
Optional<MetatypeRepresentation> storedRepr);
1824-
Type buildProtocolType(ProtocolTypeRepr *repr,
1825-
Type instanceType,
1826-
Optional<MetatypeRepresentation> storedRepr);
1827-
1828-
Type resolveOpaqueReturnType(TypeRepr *repr, StringRef mangledName,
1829-
unsigned ordinal,
1830-
TypeResolutionOptions options);
1797+
NeverNullType resolveIdentifierType(IdentTypeRepr *IdType,
1798+
TypeResolutionOptions options);
1799+
NeverNullType resolveSpecifierTypeRepr(SpecifierTypeRepr *repr,
1800+
TypeResolutionOptions options);
1801+
NeverNullType resolveArrayType(ArrayTypeRepr *repr,
1802+
TypeResolutionOptions options);
1803+
NeverNullType resolveDictionaryType(DictionaryTypeRepr *repr,
1804+
TypeResolutionOptions options);
1805+
NeverNullType resolveOptionalType(OptionalTypeRepr *repr,
1806+
TypeResolutionOptions options);
1807+
NeverNullType resolveImplicitlyUnwrappedOptionalType(
1808+
ImplicitlyUnwrappedOptionalTypeRepr *repr,
1809+
TypeResolutionOptions options, bool isDirect);
1810+
NeverNullType resolveTupleType(TupleTypeRepr *repr,
1811+
TypeResolutionOptions options);
1812+
NeverNullType resolveCompositionType(CompositionTypeRepr *repr,
1813+
TypeResolutionOptions options);
1814+
NeverNullType resolveMetatypeType(MetatypeTypeRepr *repr,
1815+
TypeResolutionOptions options);
1816+
NeverNullType resolveProtocolType(ProtocolTypeRepr *repr,
1817+
TypeResolutionOptions options);
1818+
NeverNullType resolveSILBoxType(SILBoxTypeRepr *repr,
1819+
TypeResolutionOptions options);
1820+
1821+
NeverNullType
1822+
buildMetatypeType(MetatypeTypeRepr *repr, Type instanceType,
1823+
Optional<MetatypeRepresentation> storedRepr);
1824+
NeverNullType
1825+
buildProtocolType(ProtocolTypeRepr *repr, Type instanceType,
1826+
Optional<MetatypeRepresentation> storedRepr);
1827+
1828+
NeverNullType resolveOpaqueReturnType(TypeRepr *repr, StringRef mangledName,
1829+
unsigned ordinal,
1830+
TypeResolutionOptions options);
18311831

18321832
/// Returns true if the given type conforms to `Differentiable` in the
18331833
/// module of `DC`. If `tangentVectorEqualsSelf` is true, returns true iff
@@ -1923,7 +1923,7 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
19231923
// Default non-escaping for closure parameters
19241924
auto result =
19251925
resolveASTFunctionType(cast<FunctionTypeRepr>(repr), options);
1926-
if (result && result->is<FunctionType>())
1926+
if (result->is<FunctionType>())
19271927
return applyNonEscapingIfNecessary(result, options);
19281928
return result;
19291929
}
@@ -1995,18 +1995,19 @@ static Type rebuildWithDynamicSelf(ASTContext &Context, Type ty) {
19951995
}
19961996
}
19971997

1998-
Type TypeResolver::resolveAttributedType(AttributedTypeRepr *repr,
1999-
TypeResolutionOptions options) {
1998+
NeverNullType
1999+
TypeResolver::resolveAttributedType(AttributedTypeRepr *repr,
2000+
TypeResolutionOptions options) {
20002001
// Copy the attributes, since we're about to start hacking on them.
20012002
TypeAttributes attrs = repr->getAttrs();
20022003
assert(!attrs.empty());
20032004

20042005
return resolveAttributedType(attrs, repr->getTypeRepr(), options);
20052006
}
20062007

2007-
Type TypeResolver::resolveAttributedType(TypeAttributes &attrs,
2008-
TypeRepr *repr,
2009-
TypeResolutionOptions options) {
2008+
NeverNullType
2009+
TypeResolver::resolveAttributedType(TypeAttributes &attrs, TypeRepr *repr,
2010+
TypeResolutionOptions options) {
20102011
// Convenience to grab the source range of a type attribute.
20112012
auto getTypeAttrRangeWithAt = [](ASTContext &ctx, SourceLoc attrLoc) {
20122013
return SourceRange(attrLoc, attrLoc.getAdvancedLoc(1));
@@ -2630,10 +2631,10 @@ TypeResolver::resolveASTFunctionTypeParams(TupleTypeRepr *inputRepr,
26302631
return elements;
26312632
}
26322633

2633-
Type TypeResolver::resolveOpaqueReturnType(TypeRepr *repr,
2634-
StringRef mangledName,
2635-
unsigned ordinal,
2636-
TypeResolutionOptions options) {
2634+
NeverNullType
2635+
TypeResolver::resolveOpaqueReturnType(TypeRepr *repr, StringRef mangledName,
2636+
unsigned ordinal,
2637+
TypeResolutionOptions options) {
26372638
// The type repr should be a generic identifier type. We don't really use
26382639
// the identifier for anything, but we do resolve the generic arguments
26392640
// to instantiate the possibly-generic opaque type.
@@ -2672,7 +2673,7 @@ Type TypeResolver::resolveOpaqueReturnType(TypeRepr *repr,
26722673
return ty;
26732674
}
26742675

2675-
Type TypeResolver::resolveASTFunctionType(
2676+
NeverNullType TypeResolver::resolveASTFunctionType(
26762677
FunctionTypeRepr *repr, TypeResolutionOptions parentOptions,
26772678
AnyFunctionType::Representation representation, bool noescape,
26782679
const clang::Type *parsedClangFunctionType,
@@ -2807,8 +2808,8 @@ bool TypeResolver::isDifferentiable(Type type, bool tangentVectorEqualsSelf) {
28072808
return type->getCanonicalType() == tanSpace->getCanonicalType();
28082809
}
28092810

2810-
Type TypeResolver::resolveSILBoxType(SILBoxTypeRepr *repr,
2811-
TypeResolutionOptions options) {
2811+
NeverNullType TypeResolver::resolveSILBoxType(SILBoxTypeRepr *repr,
2812+
TypeResolutionOptions options) {
28122813
// Resolve the field types.
28132814
SmallVector<SILField, 4> fields;
28142815
{
@@ -2872,7 +2873,7 @@ Type TypeResolver::resolveSILBoxType(SILBoxTypeRepr *repr,
28722873
return SILBoxType::get(getASTContext(), layout, subMap);
28732874
}
28742875

2875-
Type TypeResolver::resolveSILFunctionType(
2876+
NeverNullType TypeResolver::resolveSILFunctionType(
28762877
FunctionTypeRepr *repr, TypeResolutionOptions options,
28772878
SILCoroutineKind coroutineKind,
28782879
SILFunctionType::ExtInfoBuilder extInfoBuilder, ParameterConvention callee,
@@ -3287,8 +3288,9 @@ bool TypeResolver::resolveSILResults(TypeRepr *repr,
32873288
yields, ordinaryResults, errorResult);
32883289
}
32893290

3290-
Type TypeResolver::resolveIdentifierType(IdentTypeRepr *IdType,
3291-
TypeResolutionOptions options) {
3291+
NeverNullType
3292+
TypeResolver::resolveIdentifierType(IdentTypeRepr *IdType,
3293+
TypeResolutionOptions options) {
32923294
auto ComponentRange = IdType->getComponentRange();
32933295
auto Components = llvm::makeArrayRef(ComponentRange.begin(),
32943296
ComponentRange.end());
@@ -3322,8 +3324,9 @@ Type TypeResolver::resolveIdentifierType(IdentTypeRepr *IdType,
33223324
return result;
33233325
}
33243326

3325-
Type TypeResolver::resolveSpecifierTypeRepr(SpecifierTypeRepr *repr,
3326-
TypeResolutionOptions options) {
3327+
NeverNullType
3328+
TypeResolver::resolveSpecifierTypeRepr(SpecifierTypeRepr *repr,
3329+
TypeResolutionOptions options) {
33273330
// inout is only valid for (non-Subscript and non-EnumCaseDecl)
33283331
// function parameters.
33293332
if (!options.is(TypeResolverContext::FunctionInput) ||
@@ -3364,9 +3367,8 @@ Type TypeResolver::resolveSpecifierTypeRepr(SpecifierTypeRepr *repr,
33643367
return resolveType(repr->getBase(), options);
33653368
}
33663369

3367-
3368-
Type TypeResolver::resolveArrayType(ArrayTypeRepr *repr,
3369-
TypeResolutionOptions options) {
3370+
NeverNullType TypeResolver::resolveArrayType(ArrayTypeRepr *repr,
3371+
TypeResolutionOptions options) {
33703372
auto baseTy = resolveType(repr->getBase(), options.withoutContext());
33713373
if (baseTy->hasError()) {
33723374
return ErrorType::get(getASTContext());
@@ -3380,8 +3382,9 @@ Type TypeResolver::resolveArrayType(ArrayTypeRepr *repr,
33803382
return sliceTy;
33813383
}
33823384

3383-
Type TypeResolver::resolveDictionaryType(DictionaryTypeRepr *repr,
3384-
TypeResolutionOptions options) {
3385+
NeverNullType
3386+
TypeResolver::resolveDictionaryType(DictionaryTypeRepr *repr,
3387+
TypeResolutionOptions options) {
33853388
options = adjustOptionsForGenericArgs(options);
33863389

33873390
auto keyTy = resolveType(repr->getKey(), options.withoutContext());
@@ -3410,8 +3413,8 @@ Type TypeResolver::resolveDictionaryType(DictionaryTypeRepr *repr,
34103413
return DictionaryType::get(keyTy, valueTy);
34113414
}
34123415

3413-
Type TypeResolver::resolveOptionalType(OptionalTypeRepr *repr,
3414-
TypeResolutionOptions options) {
3416+
NeverNullType TypeResolver::resolveOptionalType(OptionalTypeRepr *repr,
3417+
TypeResolutionOptions options) {
34153418
TypeResolutionOptions elementOptions = options.withoutContext(true);
34163419
elementOptions.setContext(TypeResolverContext::ImmediateOptionalTypeArgument);
34173420

@@ -3429,10 +3432,9 @@ Type TypeResolver::resolveOptionalType(OptionalTypeRepr *repr,
34293432
return optionalTy;
34303433
}
34313434

3432-
Type TypeResolver::resolveImplicitlyUnwrappedOptionalType(
3433-
ImplicitlyUnwrappedOptionalTypeRepr *repr,
3434-
TypeResolutionOptions options,
3435-
bool isDirect) {
3435+
NeverNullType TypeResolver::resolveImplicitlyUnwrappedOptionalType(
3436+
ImplicitlyUnwrappedOptionalTypeRepr *repr, TypeResolutionOptions options,
3437+
bool isDirect) {
34363438
TypeResolutionFlags allowIUO = TypeResolutionFlags::SILType;
34373439

34383440
bool doDiag = false;
@@ -3500,8 +3502,8 @@ Type TypeResolver::resolveImplicitlyUnwrappedOptionalType(
35003502
return uncheckedOptionalTy;
35013503
}
35023504

3503-
Type TypeResolver::resolveTupleType(TupleTypeRepr *repr,
3504-
TypeResolutionOptions options) {
3505+
NeverNullType TypeResolver::resolveTupleType(TupleTypeRepr *repr,
3506+
TypeResolutionOptions options) {
35053507
SmallVector<TupleTypeElt, 8> elements;
35063508
elements.reserve(repr->getNumElements());
35073509

@@ -3568,8 +3570,9 @@ Type TypeResolver::resolveTupleType(TupleTypeRepr *repr,
35683570
return TupleType::get(elements, getASTContext());
35693571
}
35703572

3571-
Type TypeResolver::resolveCompositionType(CompositionTypeRepr *repr,
3572-
TypeResolutionOptions options) {
3573+
NeverNullType
3574+
TypeResolver::resolveCompositionType(CompositionTypeRepr *repr,
3575+
TypeResolutionOptions options) {
35733576

35743577
// Note that the superclass type will appear as part of one of the
35753578
// types in 'Members', so it's not used when constructing the
@@ -3636,8 +3639,8 @@ Type TypeResolver::resolveCompositionType(CompositionTypeRepr *repr,
36363639
/*HasExplicitAnyObject=*/false);
36373640
}
36383641

3639-
Type TypeResolver::resolveMetatypeType(MetatypeTypeRepr *repr,
3640-
TypeResolutionOptions options) {
3642+
NeverNullType TypeResolver::resolveMetatypeType(MetatypeTypeRepr *repr,
3643+
TypeResolutionOptions options) {
36413644
// The instance type of a metatype is always abstract, not SIL-lowered.
36423645
auto ty = resolveType(repr->getBase(), options.withoutContext());
36433646
if (ty->hasError()) {
@@ -3657,10 +3660,9 @@ Type TypeResolver::resolveMetatypeType(MetatypeTypeRepr *repr,
36573660
return buildMetatypeType(repr, ty, storedRepr);
36583661
}
36593662

3660-
Type TypeResolver::buildMetatypeType(
3661-
MetatypeTypeRepr *repr,
3662-
Type instanceType,
3663-
Optional<MetatypeRepresentation> storedRepr) {
3663+
NeverNullType
3664+
TypeResolver::buildMetatypeType(MetatypeTypeRepr *repr, Type instanceType,
3665+
Optional<MetatypeRepresentation> storedRepr) {
36643666
if (instanceType->isAnyExistentialType()) {
36653667
// TODO: diagnose invalid representations?
36663668
return ExistentialMetatypeType::get(instanceType, storedRepr);
@@ -3669,8 +3671,8 @@ Type TypeResolver::buildMetatypeType(
36693671
}
36703672
}
36713673

3672-
Type TypeResolver::resolveProtocolType(ProtocolTypeRepr *repr,
3673-
TypeResolutionOptions options) {
3674+
NeverNullType TypeResolver::resolveProtocolType(ProtocolTypeRepr *repr,
3675+
TypeResolutionOptions options) {
36743676
// The instance type of a metatype is always abstract, not SIL-lowered.
36753677
auto ty = resolveType(repr->getBase(), options.withoutContext());
36763678
if (ty->hasError()) {
@@ -3690,10 +3692,9 @@ Type TypeResolver::resolveProtocolType(ProtocolTypeRepr *repr,
36903692
return buildProtocolType(repr, ty, storedRepr);
36913693
}
36923694

3693-
Type TypeResolver::buildProtocolType(
3694-
ProtocolTypeRepr *repr,
3695-
Type instanceType,
3696-
Optional<MetatypeRepresentation> storedRepr) {
3695+
NeverNullType
3696+
TypeResolver::buildProtocolType(ProtocolTypeRepr *repr, Type instanceType,
3697+
Optional<MetatypeRepresentation> storedRepr) {
36973698
if (!instanceType->isAnyExistentialType()) {
36983699
diagnose(repr->getProtocolLoc(), diag::dot_protocol_on_non_existential,
36993700
instanceType);

0 commit comments

Comments
 (0)