mirror of
https://github.com/intel/llvm.git
synced 2026-01-21 04:14:03 +08:00
[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:
@@ -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
|
||||
|
||||
|
||||
@@ -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>;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user