@@ -1204,7 +1204,7 @@ class DeclarationVisitor : public ArraySpecVisitor,
1204
1204
const parser::Name &, const parser::Name *);
1205
1205
Symbol *MakeTypeSymbol (const SourceName &, Details &&);
1206
1206
Symbol *MakeTypeSymbol (const parser::Name &, Details &&);
1207
- bool OkToAddComponent (const parser::Name &, const Symbol * = nullptr );
1207
+ bool OkToAddComponent (const parser::Name &, const Symbol *extends = nullptr );
1208
1208
ParamValue GetParamValue (
1209
1209
const parser::TypeParamValue &, common::TypeParamAttr attr);
1210
1210
void CheckCommonBlockDerivedType (
@@ -5606,7 +5606,7 @@ void DeclarationVisitor::Post(const parser::DerivedTypeStmt &x) {
5606
5606
comp.set (Symbol::Flag::ParentComp);
5607
5607
DeclTypeSpec &type{currScope ().MakeDerivedType (
5608
5608
DeclTypeSpec::TypeDerived, std::move (*extendsType))};
5609
- type.derivedTypeSpec ().set_scope (* extendsSymbol.scope ());
5609
+ type.derivedTypeSpec ().set_scope (DEREF ( extendsSymbol.scope () ));
5610
5610
comp.SetType (type);
5611
5611
DerivedTypeDetails &details{symbol.get <DerivedTypeDetails>()};
5612
5612
details.add_component (comp);
@@ -6797,15 +6797,20 @@ std::optional<DerivedTypeSpec> DeclarationVisitor::ResolveDerivedType(
6797
6797
6798
6798
std::optional<DerivedTypeSpec> DeclarationVisitor::ResolveExtendsType (
6799
6799
const parser::Name &typeName, const parser::Name *extendsName) {
6800
- if (!extendsName) {
6801
- return std::nullopt;
6802
- } else if (typeName.source == extendsName->source ) {
6803
- Say (extendsName->source ,
6804
- " Derived type '%s' cannot extend itself" _err_en_US);
6805
- return std::nullopt;
6806
- } else {
6807
- return ResolveDerivedType (*extendsName);
6800
+ if (extendsName) {
6801
+ if (typeName.source == extendsName->source ) {
6802
+ Say (extendsName->source ,
6803
+ " Derived type '%s' cannot extend itself" _err_en_US);
6804
+ } else if (auto dtSpec{ResolveDerivedType (*extendsName)}) {
6805
+ if (!dtSpec->IsForwardReferenced ()) {
6806
+ return dtSpec;
6807
+ }
6808
+ Say (typeName.source ,
6809
+ " Derived type '%s' cannot extend type '%s' that has not yet been defined" _err_en_US,
6810
+ typeName.source , extendsName->source );
6811
+ }
6808
6812
}
6813
+ return std::nullopt;
6809
6814
}
6810
6815
6811
6816
Symbol *DeclarationVisitor::NoteInterfaceName (const parser::Name &name) {
0 commit comments