[flang-commits] [flang] b29d632 - [flang] Accept BIND(C) derived type for Cray pointees (#76538)
via flang-commits
flang-commits at lists.llvm.org
Tue Jan 2 09:04:30 PST 2024
Author: Peter Klausler
Date: 2024-01-02T09:04:26-08:00
New Revision: b29d632eea48a14f46af2a9f04bd28798cb55612
URL: https://github.com/llvm/llvm-project/commit/b29d632eea48a14f46af2a9f04bd28798cb55612
DIFF: https://github.com/llvm/llvm-project/commit/b29d632eea48a14f46af2a9f04bd28798cb55612.diff
LOG: [flang] Accept BIND(C) derived type for Cray pointees (#76538)
The compiler requires that a Cray pointee have a SEQUENCE type, but a
recent bug report points out that a BIND(C) type should also be
accepted.
Fixes https://github.com/llvm/llvm-project/issues/76529.
Added:
Modified:
flang/include/flang/Evaluate/tools.h
flang/lib/Evaluate/tools.cpp
flang/lib/Semantics/resolve-names.cpp
flang/test/Semantics/resolve61.f90
Removed:
################################################################################
diff --git a/flang/include/flang/Evaluate/tools.h b/flang/include/flang/Evaluate/tools.h
index 8a47a9f651661a..51414d61785f07 100644
--- a/flang/include/flang/Evaluate/tools.h
+++ b/flang/include/flang/Evaluate/tools.h
@@ -1227,6 +1227,7 @@ bool IsFunctionResult(const Symbol &);
bool IsKindTypeParameter(const Symbol &);
bool IsLenTypeParameter(const Symbol &);
bool IsExtensibleType(const DerivedTypeSpec *);
+bool IsSequenceOrBindCType(const DerivedTypeSpec *);
bool IsBuiltinDerivedType(const DerivedTypeSpec *derived, const char *name);
bool IsBuiltinCPtr(const Symbol &);
bool IsEventType(const DerivedTypeSpec *);
diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 8c755da4a2d8b8..44a6fa4333cf36 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -1724,9 +1724,13 @@ bool IsLenTypeParameter(const Symbol &symbol) {
}
bool IsExtensibleType(const DerivedTypeSpec *derived) {
- return derived && !IsIsoCType(derived) &&
- !derived->typeSymbol().attrs().test(Attr::BIND_C) &&
- !derived->typeSymbol().get<DerivedTypeDetails>().sequence();
+ return !IsSequenceOrBindCType(derived) && !IsIsoCType(derived);
+}
+
+bool IsSequenceOrBindCType(const DerivedTypeSpec *derived) {
+ return derived &&
+ (derived->typeSymbol().attrs().test(Attr::BIND_C) ||
+ derived->typeSymbol().get<DerivedTypeDetails>().sequence());
}
bool IsBuiltinDerivedType(const DerivedTypeSpec *derived, const char *name) {
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index e30eb5070d789a..64fc7de120873a 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5940,9 +5940,9 @@ void DeclarationVisitor::Post(const parser::BasedPointer &bp) {
}
if (const auto *pointeeType{pointee->GetType()}) {
if (const auto *derived{pointeeType->AsDerived()}) {
- if (!derived->typeSymbol().get<DerivedTypeDetails>().sequence()) {
+ if (!IsSequenceOrBindCType(derived)) {
Say(pointeeName,
- "Type of Cray pointee '%s' is a non-sequence derived type"_err_en_US);
+ "Type of Cray pointee '%s' is a derived type that is neither SEQUENCE nor BIND(C)"_err_en_US);
}
}
}
@@ -6177,15 +6177,13 @@ void DeclarationVisitor::CheckCommonBlocks() {
Say(name,
"Unlimited polymorphic pointer '%s' may not appear in a COMMON block"_err_en_US);
} else if (const auto *derived{type->AsDerived()}) {
- auto &typeSymbol{derived->typeSymbol()};
- if (!typeSymbol.attrs().test(Attr::BIND_C) &&
- !typeSymbol.get<DerivedTypeDetails>().sequence()) {
+ if (!IsSequenceOrBindCType(derived)) {
Say(name,
"Derived type '%s' in COMMON block must have the BIND or"
" SEQUENCE attribute"_err_en_US);
}
UnorderedSymbolSet typeSet;
- CheckCommonBlockDerivedType(name, typeSymbol, typeSet);
+ CheckCommonBlockDerivedType(name, derived->typeSymbol(), typeSet);
}
}
}
diff --git a/flang/test/Semantics/resolve61.f90 b/flang/test/Semantics/resolve61.f90
index 6728050243ec37..d6499f07b86091 100644
--- a/flang/test/Semantics/resolve61.f90
+++ b/flang/test/Semantics/resolve61.f90
@@ -107,11 +107,16 @@ subroutine p12
type t2
integer c2
end type
+ type, bind(c) :: t3
+ integer c3
+ end type
type(t1) :: x1
type(t2) :: x2
+ type(t3) :: x3
pointer(a, x1)
- !ERROR: Type of Cray pointee 'x2' is a non-sequence derived type
+ !ERROR: Type of Cray pointee 'x2' is a derived type that is neither SEQUENCE nor BIND(C)
pointer(b, x2)
+ pointer(c, x3)
end
subroutine p13
More information about the flang-commits
mailing list