@@ -3665,8 +3665,13 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3665
3665
bool isVariadic, isAutoClosure, isEscaping;
3666
3666
decls_block::ParenTypeLayout::readRecord (scratch, underlyingID, isVariadic,
3667
3667
isAutoClosure, isEscaping);
3668
+
3669
+ auto underlyingTy = getTypeChecked (underlyingID);
3670
+ if (!underlyingTy)
3671
+ return underlyingTy.takeError ();
3672
+
3668
3673
typeOrOffset = ParenType::get (
3669
- ctx, getType (underlyingID ),
3674
+ ctx, underlyingTy. get ( ),
3670
3675
ParameterTypeFlags (isVariadic, isAutoClosure, isEscaping));
3671
3676
break ;
3672
3677
}
@@ -3691,8 +3696,12 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3691
3696
decls_block::TupleTypeEltLayout::readRecord (
3692
3697
scratch, nameID, typeID, isVariadic, isAutoClosure, isEscaping);
3693
3698
3699
+ auto elementTy = getTypeChecked (typeID);
3700
+ if (!elementTy)
3701
+ return elementTy.takeError ();
3702
+
3694
3703
elements.emplace_back (
3695
- getType (typeID ), getIdentifier (nameID),
3704
+ elementTy. get ( ), getIdentifier (nameID),
3696
3705
ParameterTypeFlags (isVariadic, isAutoClosure, isEscaping));
3697
3706
}
3698
3707
@@ -3717,12 +3726,17 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3717
3726
return nullptr ;
3718
3727
}
3719
3728
3720
- auto Info = FunctionType::ExtInfo (*representation,
3721
- autoClosure, noescape,
3722
- throws);
3723
-
3724
- typeOrOffset = FunctionType::get (getType (inputID), getType (resultID),
3725
- Info);
3729
+ auto info = FunctionType::ExtInfo (*representation, autoClosure, noescape,
3730
+ throws);
3731
+
3732
+ auto inputTy = getTypeChecked (inputID);
3733
+ if (!inputTy)
3734
+ return inputTy.takeError ();
3735
+ auto resultTy = getTypeChecked (resultID);
3736
+ if (!resultTy)
3737
+ return resultTy.takeError ();
3738
+
3739
+ typeOrOffset = FunctionType::get (inputTy.get (), resultTy.get (), info);
3726
3740
break ;
3727
3741
}
3728
3742
@@ -3731,23 +3745,26 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3731
3745
uint8_t repr;
3732
3746
decls_block::ExistentialMetatypeTypeLayout::readRecord (scratch,
3733
3747
instanceID, repr);
3748
+ auto instanceType = getTypeChecked (instanceID);
3749
+ if (!instanceType)
3750
+ return instanceType.takeError ();
3734
3751
3735
3752
switch (repr) {
3736
3753
case serialization::MetatypeRepresentation::MR_None:
3737
- typeOrOffset = ExistentialMetatypeType::get (getType (instanceID ));
3754
+ typeOrOffset = ExistentialMetatypeType::get (instanceType. get ( ));
3738
3755
break ;
3739
3756
3740
3757
case serialization::MetatypeRepresentation::MR_Thin:
3741
3758
error ();
3742
3759
break ;
3743
3760
3744
3761
case serialization::MetatypeRepresentation::MR_Thick:
3745
- typeOrOffset = ExistentialMetatypeType::get (getType (instanceID ),
3762
+ typeOrOffset = ExistentialMetatypeType::get (instanceType. get ( ),
3746
3763
MetatypeRepresentation::Thick);
3747
3764
break ;
3748
3765
3749
3766
case serialization::MetatypeRepresentation::MR_ObjC:
3750
- typeOrOffset = ExistentialMetatypeType::get (getType (instanceID ),
3767
+ typeOrOffset = ExistentialMetatypeType::get (instanceType. get ( ),
3751
3768
MetatypeRepresentation::ObjC);
3752
3769
break ;
3753
3770
@@ -3763,23 +3780,27 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3763
3780
uint8_t repr;
3764
3781
decls_block::MetatypeTypeLayout::readRecord (scratch, instanceID, repr);
3765
3782
3783
+ auto instanceType = getTypeChecked (instanceID);
3784
+ if (!instanceType)
3785
+ return instanceType.takeError ();
3786
+
3766
3787
switch (repr) {
3767
3788
case serialization::MetatypeRepresentation::MR_None:
3768
- typeOrOffset = MetatypeType::get (getType (instanceID ));
3789
+ typeOrOffset = MetatypeType::get (instanceType. get ( ));
3769
3790
break ;
3770
3791
3771
3792
case serialization::MetatypeRepresentation::MR_Thin:
3772
- typeOrOffset = MetatypeType::get (getType (instanceID ),
3793
+ typeOrOffset = MetatypeType::get (instanceType. get ( ),
3773
3794
MetatypeRepresentation::Thin);
3774
3795
break ;
3775
3796
3776
3797
case serialization::MetatypeRepresentation::MR_Thick:
3777
- typeOrOffset = MetatypeType::get (getType (instanceID ),
3798
+ typeOrOffset = MetatypeType::get (instanceType. get ( ),
3778
3799
MetatypeRepresentation::Thick);
3779
3800
break ;
3780
3801
3781
3802
case serialization::MetatypeRepresentation::MR_ObjC:
3782
- typeOrOffset = MetatypeType::get (getType (instanceID ),
3803
+ typeOrOffset = MetatypeType::get (instanceType. get ( ),
3783
3804
MetatypeRepresentation::ObjC);
3784
3805
break ;
3785
3806
@@ -3806,15 +3827,20 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3806
3827
case decls_block::INOUT_TYPE: {
3807
3828
TypeID objectTypeID;
3808
3829
decls_block::LValueTypeLayout::readRecord (scratch, objectTypeID);
3809
- typeOrOffset = InOutType::get (getType (objectTypeID));
3830
+
3831
+ auto objectTy = getTypeChecked (objectTypeID);
3832
+ if (!objectTy)
3833
+ return objectTy.takeError ();
3834
+
3835
+ typeOrOffset = InOutType::get (objectTy.get ());
3810
3836
break ;
3811
3837
}
3812
3838
3813
3839
case decls_block::REFERENCE_STORAGE_TYPE: {
3814
3840
uint8_t rawOwnership;
3815
- TypeID referentTypeID ;
3841
+ TypeID objectTypeID ;
3816
3842
decls_block::ReferenceStorageTypeLayout::readRecord (scratch, rawOwnership,
3817
- referentTypeID );
3843
+ objectTypeID );
3818
3844
3819
3845
auto ownership =
3820
3846
getActualOwnership ((serialization::Ownership) rawOwnership);
@@ -3823,7 +3849,11 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3823
3849
break ;
3824
3850
}
3825
3851
3826
- typeOrOffset = ReferenceStorageType::get (getType (referentTypeID),
3852
+ auto objectTy = getTypeChecked (objectTypeID);
3853
+ if (!objectTy)
3854
+ return objectTy.takeError ();
3855
+
3856
+ typeOrOffset = ReferenceStorageType::get (objectTy.get (),
3827
3857
ownership.getValue (), ctx);
3828
3858
break ;
3829
3859
}
@@ -3899,8 +3929,12 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3899
3929
hasExplicitAnyObject,
3900
3930
rawProtocolIDs);
3901
3931
SmallVector<Type, 4 > protocols;
3902
- for (TypeID protoID : rawProtocolIDs)
3903
- protocols.push_back (getType (protoID));
3932
+ for (TypeID protoID : rawProtocolIDs) {
3933
+ auto protoTy = getTypeChecked (protoID);
3934
+ if (!protoTy)
3935
+ return protoTy.takeError ();
3936
+ protocols.push_back (protoTy.get ());
3937
+ }
3904
3938
3905
3939
typeOrOffset = ProtocolCompositionType::get (ctx, protocols,
3906
3940
hasExplicitAnyObject);
@@ -3927,12 +3961,22 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
3927
3961
decls_block::BoundGenericTypeLayout::readRecord (scratch, declID, parentID,
3928
3962
rawArgumentIDs);
3929
3963
3930
- auto nominal = cast<NominalTypeDecl>(getDecl (declID));
3964
+ auto nominalOrError = getDeclChecked (declID);
3965
+ if (!nominalOrError)
3966
+ return nominalOrError.takeError ();
3967
+ auto nominal = cast<NominalTypeDecl>(nominalOrError.get ());
3968
+
3969
+ // FIXME: Check this?
3931
3970
auto parentTy = getType (parentID);
3932
3971
3933
3972
SmallVector<Type, 8 > genericArgs;
3934
- for (TypeID type : rawArgumentIDs)
3935
- genericArgs.push_back (getType (type));
3973
+ for (TypeID ID : rawArgumentIDs) {
3974
+ auto argTy = getTypeChecked (ID);
3975
+ if (!argTy)
3976
+ return argTy.takeError ();
3977
+
3978
+ genericArgs.push_back (argTy.get ());
3979
+ }
3936
3980
3937
3981
auto boundTy = BoundGenericType::get (nominal, parentTy, genericArgs);
3938
3982
typeOrOffset = boundTy;
@@ -4169,35 +4213,51 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
4169
4213
TypeID baseID;
4170
4214
decls_block::ArraySliceTypeLayout::readRecord (scratch, baseID);
4171
4215
4172
- auto sliceTy = ArraySliceType::get (getType (baseID));
4173
- typeOrOffset = sliceTy;
4216
+ auto baseTy = getTypeChecked (baseID);
4217
+ if (!baseTy)
4218
+ return baseTy.takeError ();
4219
+
4220
+ typeOrOffset = ArraySliceType::get (baseTy.get ());
4174
4221
break ;
4175
4222
}
4176
4223
4177
4224
case decls_block::DICTIONARY_TYPE: {
4178
4225
TypeID keyID, valueID;
4179
4226
decls_block::DictionaryTypeLayout::readRecord (scratch, keyID, valueID);
4180
4227
4181
- auto dictTy = DictionaryType::get (getType (keyID), getType (valueID));
4182
- typeOrOffset = dictTy;
4228
+ auto keyTy = getTypeChecked (keyID);
4229
+ if (!keyTy)
4230
+ return keyTy.takeError ();
4231
+
4232
+ auto valueTy = getTypeChecked (valueID);
4233
+ if (!valueTy)
4234
+ return valueTy.takeError ();
4235
+
4236
+ typeOrOffset = DictionaryType::get (keyTy.get (), valueTy.get ());
4183
4237
break ;
4184
4238
}
4185
4239
4186
4240
case decls_block::OPTIONAL_TYPE: {
4187
4241
TypeID baseID;
4188
4242
decls_block::OptionalTypeLayout::readRecord (scratch, baseID);
4189
4243
4190
- auto optionalTy = OptionalType::get (getType (baseID));
4191
- typeOrOffset = optionalTy;
4244
+ auto baseTy = getTypeChecked (baseID);
4245
+ if (!baseTy)
4246
+ return baseTy.takeError ();
4247
+
4248
+ typeOrOffset = OptionalType::get (baseTy.get ());
4192
4249
break ;
4193
4250
}
4194
4251
4195
4252
case decls_block::UNCHECKED_OPTIONAL_TYPE: {
4196
4253
TypeID baseID;
4197
4254
decls_block::ImplicitlyUnwrappedOptionalTypeLayout::readRecord (scratch, baseID);
4198
4255
4199
- auto optionalTy = ImplicitlyUnwrappedOptionalType::get (getType (baseID));
4200
- typeOrOffset = optionalTy;
4256
+ auto baseTy = getTypeChecked (baseID);
4257
+ if (!baseTy)
4258
+ return baseTy.takeError ();
4259
+
4260
+ typeOrOffset = ImplicitlyUnwrappedOptionalType::get (baseTy.get ());
4201
4261
break ;
4202
4262
}
4203
4263
0 commit comments