void Post(const parser::DeclarationTypeSpec::Type &);
void Post(const parser::DeclarationTypeSpec::Class &);
bool Pre(const parser::DerivedTypeSpec &);
- bool Pre(const parser::DerivedTypeDef &x);
void Post(const parser::DerivedTypeDef &x);
bool Pre(const parser::DerivedTypeStmt &x);
void Post(const parser::DerivedTypeStmt &x);
bool sawContains{false}; // currently processing bindings
bool sequence{false}; // is a sequence type
} derivedTypeInfo_;
- // In a DerivedTypeDef, this is data collected for it
- std::unique_ptr<DerivedTypeDef::Data> derivedTypeData_;
// In a ProcedureDeclarationStmt or ProcComponentDefStmt, this is
// the interface name, if any.
const SourceName *interfaceName_{nullptr};
: Symbol::Flag::Subroutine);
}
details->set_interface(interface);
- symbol.attrs().set(Attr::EXTERNAL);
}
}
BeginDerivedTypeSpec(derivedTypeSpec);
return true;
}
-bool DeclarationVisitor::Pre(const parser::DerivedTypeDef &x) {
- CHECK(!derivedTypeData_);
- derivedTypeData_ = std::make_unique<DerivedTypeDef::Data>();
- return true;
-}
void DeclarationVisitor::Post(const parser::DerivedTypeDef &x) {
- derivedTypeData_.reset();
std::set<SourceName> paramNames;
auto &scope{currScope()};
auto &stmt{std::get<parser::Statement<parser::DerivedTypeStmt>>(x.t)};
}
bool DeclarationVisitor::Pre(const parser::TypeAttrSpec::Extends &x) {
derivedTypeInfo_.extends = &x.v.source;
- derivedTypeData_->extends = &x.v.source;
return false;
}
}
bool DeclarationVisitor::Pre(const parser::SequenceStmt &x) {
derivedTypeInfo_.sequence = true;
- derivedTypeData_->sequence = true;
return false;
}
void DeclarationVisitor::Post(const parser::ComponentDecl &x) {
} else if (auto &type{GetDeclTypeSpec()}) {
interface.set_type(*type);
}
- if (derivedTypeData_) {
- derivedTypeData_->procComps.emplace_back(
- ProcDecl{name.source}, GetAttrs(), interface);
- } else {
- DeclareProcEntity(name, GetAttrs(), interface);
+ auto attrs{GetAttrs()};
+ if (currScope().kind() != Scope::Kind::DerivedType) {
+ attrs.set(Attr::EXTERNAL);
}
+ DeclareProcEntity(name, attrs, interface);
}
bool DeclarationVisitor::Pre(const parser::TypeBoundProcedurePart &x) {
external b, d
procedure() :: e
procedure(real) :: f
+ procedure(s) :: g
+ type t
+ procedure(), pointer, nopass :: e
+ procedure(real), nopass, pointer :: f
+ procedure(s), private, pointer :: g
+ end type
+contains
+ subroutine s(x)
+ class(t) :: x
+ end
end
!Expect: m.mod
!module m
-! procedure(real)::a
-! procedure(logical)::b
-! procedure(complex)::c
-! procedure()::d
-! procedure()::e
-! procedure(real)::f
+! procedure(real)::a
+! procedure(logical)::b
+! procedure(complex)::c
+! procedure()::d
+! procedure()::e
+! procedure(real)::f
+! procedure(s)::g
+! type::t
+! procedure(),nopass,pointer::e
+! procedure(real),nopass,pointer::f
+! procedure(s),pointer,private::g
+! end type
+!contains
+! subroutine s(x)
+! class(t)::x
+! end
!end