@@ -533,15 +533,7 @@ static auto ConvertStructToClass(Context& context, SemIR::StructType src_type,
533533 ConversionTarget target) -> SemIR::InstId {
534534 PendingBlock target_block (context);
535535 auto & dest_class_info = context.classes ().Get (dest_type.class_id );
536- if (dest_class_info.inheritance_kind == SemIR::Class::Abstract) {
537- CARBON_DIAGNOSTIC (ConstructionOfAbstractClass, Error,
538- " cannot construct instance of abstract class; "
539- " consider using `partial {0}` instead" ,
540- TypeIdAsRawType);
541- context.emitter ().Emit (value_id, ConstructionOfAbstractClass,
542- target.type_id );
543- return SemIR::InstId::BuiltinError;
544- }
536+ CARBON_CHECK (dest_class_info.inheritance_kind != SemIR::Class::Abstract);
545537 auto object_repr_id =
546538 dest_class_info.GetObjectRepr (context.sem_ir (), dest_type.specific_id );
547539 if (object_repr_id == SemIR::TypeId::Error) {
@@ -937,23 +929,38 @@ auto Convert(Context& context, SemIR::LocId loc_id, SemIR::InstId expr_id,
937929 }
938930
939931 // We can only perform initialization for complete types.
940- if (!context.TryToCompleteType (target.type_id , [&] {
941- CARBON_DIAGNOSTIC (IncompleteTypeInInit, Error,
942- " initialization of incomplete type {0}" ,
943- SemIR::TypeId);
944- CARBON_DIAGNOSTIC (IncompleteTypeInValueConversion, Error,
945- " forming value of incomplete type {0}" ,
946- SemIR::TypeId);
947- CARBON_DIAGNOSTIC (IncompleteTypeInConversion, Error,
948- " invalid use of incomplete type {0}" , SemIR::TypeId);
949- return context.emitter ().Build (loc_id,
950- target.is_initializer ()
951- ? IncompleteTypeInInit
952- : target.kind == ConversionTarget::Value
953- ? IncompleteTypeInValueConversion
954- : IncompleteTypeInConversion,
955- target.type_id );
956- })) {
932+ if (!context.TryToCompleteType (
933+ target.type_id ,
934+ [&] {
935+ CARBON_DIAGNOSTIC (IncompleteTypeInInit, Error,
936+ " initialization of incomplete type {0}" ,
937+ SemIR::TypeId);
938+ CARBON_DIAGNOSTIC (IncompleteTypeInValueConversion, Error,
939+ " forming value of incomplete type {0}" ,
940+ SemIR::TypeId);
941+ CARBON_DIAGNOSTIC (IncompleteTypeInConversion, Error,
942+ " invalid use of incomplete type {0}" ,
943+ SemIR::TypeId);
944+ assert (!target.is_initializer ());
945+ assert (target.kind == ConversionTarget::Value);
946+ return context.emitter ().Build (
947+ loc_id,
948+ target.is_initializer () ? IncompleteTypeInInit
949+ : target.kind == ConversionTarget::Value
950+ ? IncompleteTypeInValueConversion
951+ : IncompleteTypeInConversion,
952+ target.type_id );
953+ },
954+ [&] {
955+ CARBON_DIAGNOSTIC (AbstractTypeInInit, Error,
956+ " initialization of abstract type {0}" ,
957+ SemIR::TypeId);
958+ if (!target.is_initializer ()) {
959+ return context.emitter ().BuildSuppressed ();
960+ }
961+ return context.emitter ().Build (loc_id, AbstractTypeInInit,
962+ target.type_id );
963+ })) {
957964 return SemIR::InstId::BuiltinError;
958965 }
959966
0 commit comments