[flang-commits] [PATCH] D117158: [flang] Allow pointers to non-sequence types in sequence types
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Wed Jan 12 14:15:30 PST 2022
klausler created this revision.
klausler added a reviewer: PeteSteinfeld.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
klausler requested review of this revision.
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.
https://reviews.llvm.org/D117158
Files:
flang/docs/Extensions.md
flang/include/flang/Common/Fortran-features.h
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/resolve31.f90
Index: flang/test/Semantics/resolve31.f90
===================================================================
--- flang/test/Semantics/resolve31.f90
+++ flang/test/Semantics/resolve31.f90
@@ -83,6 +83,8 @@
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
Index: flang/lib/Semantics/resolve-names.cpp
===================================================================
--- flang/lib/Semantics/resolve-names.cpp
+++ flang/lib/Semantics/resolve-names.cpp
@@ -4280,6 +4280,20 @@
GetAttrs().HasAny({Attr::POINTER, Attr::ALLOCATABLE}));
Walk(std::get<parser::DeclarationTypeSpec>(x.t));
set_allowForwardReferenceToDerivedType(false);
+ if (derivedTypeInfo_.sequence) { // C740
+ if (const auto *declType{GetDeclTypeSpec()}) {
+ if (!declType->AsIntrinsic() && !declType->IsSequenceType()) {
+ 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);
+ }
+ }
+ }
+ }
Walk(std::get<std::list<parser::ComponentDecl>>(x.t));
return false;
}
Index: flang/include/flang/Common/Fortran-features.h
===================================================================
--- flang/include/flang/Common/Fortran-features.h
+++ flang/include/flang/Common/Fortran-features.h
@@ -31,7 +31,7 @@
OldLabelDoEndStatements, LogicalIntegerAssignment, EmptySourceFile,
ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways,
ForwardRefDummyImplicitNone, OpenAccessAppend, BOZAsDefaultInteger,
- DistinguishableSpecifics, DefaultSave)
+ DistinguishableSpecifics, DefaultSave, PointerInSeqType)
using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;
Index: flang/docs/Extensions.md
===================================================================
--- flang/docs/Extensions.md
+++ flang/docs/Extensions.md
@@ -190,6 +190,10 @@
exactly one is unlimited polymorphic).
* External unit 0 is predefined and connected to the standard error output,
and defined as `ERROR_UNIT` in the intrinsic `ISO_FORTRAN_ENV` module.
+* 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117158.399462.patch
Type: text/x-patch
Size: 3001 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20220112/b8a3c464/attachment.bin>
More information about the flang-commits
mailing list