[flang] Allow pointers to non-sequence types in sequence types

Derived types with SEQUENCE must have data components of sequence
types; but this rule is relaxed as common an extension in the case of
pointer components, whose targets' types are not really relevant
to the implementation requirements of sequence types.

Differential Revision: https://reviews.llvm.org/D117158
This commit is contained in:
Peter Klausler
2022-01-04 17:09:33 -08:00
parent 2bcba21c8b
commit dc65c3f2ff
4 changed files with 15 additions and 3 deletions

View File

@@ -200,6 +200,10 @@ end
* Multiple specifications of the SAVE attribute on the same object
are allowed, with a warning.
* Specific intrinsic functions BABS, IIABS, JIABS, KIABS, ZABS, and CDABS.
* A `POINTER` component's type need not be a sequence type when
the component appears in a derived type with `SEQUENCE`.
(This case should probably be an exception to constraint C740 in
the standard.)
### Extensions supported when enabled by options

View File

@@ -31,7 +31,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
OldLabelDoEndStatements, LogicalIntegerAssignment, EmptySourceFile,
ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways,
ForwardRefDummyImplicitNone, OpenAccessAppend, BOZAsDefaultInteger,
DistinguishableSpecifics, DefaultSave)
DistinguishableSpecifics, DefaultSave, PointerInSeqType)
using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;

View File

@@ -4296,8 +4296,14 @@ bool DeclarationVisitor::Pre(const parser::DataComponentDefStmt &x) {
if (derivedTypeInfo_.sequence) { // C740
if (const auto *declType{GetDeclTypeSpec()}) {
if (!declType->AsIntrinsic() && !declType->IsSequenceType()) {
Say("A sequence type data component must either be of an"
" intrinsic type or a derived sequence type"_err_en_US);
if (GetAttrs().test(Attr::POINTER) &&
context().IsEnabled(common::LanguageFeature::PointerInSeqType)) {
if (context().ShouldWarn(common::LanguageFeature::PointerInSeqType)) {
Say("A sequence type data component that is a pointer to a non-sequence type is not standard"_en_US);
}
} else {
Say("A sequence type data component must either be of an intrinsic type or a derived sequence type"_err_en_US);
}
}
}
}

View File

@@ -83,6 +83,8 @@ module m4
class(*), allocatable :: typeStarField
!ERROR: A sequence type data component must either be of an intrinsic type or a derived sequence type
type(plainType) :: testField1
!Pointers are ok as an extension
type(plainType), pointer :: testField1p
type(sequenceType) :: testField2
procedure(real), pointer, nopass :: procField
end type testType