[flang-commits] [flang] [flang] Accept BIND(C) derived type for Cray pointees (PR #76538)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue Jan 2 07:54:30 PST 2024
https://github.com/klausler updated https://github.com/llvm/llvm-project/pull/76538
>From 0504426af9f066b1243e27c25c5c7008e9b1e697 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Thu, 28 Dec 2023 13:47:00 -0800
Subject: [PATCH] [flang] Accept BIND(C) derived type for Cray pointees
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.
---
flang/include/flang/Evaluate/tools.h | 1 +
flang/lib/Evaluate/tools.cpp | 10 +++++++---
flang/lib/Semantics/resolve-names.cpp | 10 ++++------
flang/test/Semantics/resolve61.f90 | 7 ++++++-
4 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/flang/include/flang/Evaluate/tools.h b/flang/include/flang/Evaluate/tools.h
index 8a47a9f651661ad..51414d61785f077 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 8c755da4a2d8b81..44a6fa4333cf365 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 f5f7b99aba2551f..6134c45dca5ac09 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -5939,9 +5939,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);
}
}
}
@@ -6176,15 +6176,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 6728050243ec378..d6499f07b860910 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