mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 05:40:09 +00:00
[flang] Allow assumed-shape element pass to dummy arg with ignore_tkr (#78196)
This is allowed by gfortran and ifort with `![GCC|DEC]$ ATTRIBUTES NO_ARG_CHECK`
This commit is contained in:
parent
ee0b4d9681
commit
50e2581a19
@ -18,9 +18,10 @@ A list of non-standard directives supported by Flang
|
|||||||
The directive allow actual arguments that would otherwise be diagnosed
|
The directive allow actual arguments that would otherwise be diagnosed
|
||||||
as incompatible in type (T), kind (K), rank (R), CUDA device (D), or
|
as incompatible in type (T), kind (K), rank (R), CUDA device (D), or
|
||||||
managed (M) status. The letter (A) is a shorthand for all of these,
|
managed (M) status. The letter (A) is a shorthand for all of these,
|
||||||
and is the default when no letters appear. The letter (C) is a legacy
|
and is the default when no letters appear. The letter (C) checks for
|
||||||
no-op. For example, if one wanted to call a "set all bytes to zero"
|
contiguity for example allowing an element of an assumed-shape array to be
|
||||||
utility that could be applied to arrays of any type or rank:
|
passed as a dummy argument. For example, if one wanted to call a "set all
|
||||||
|
bytes to zero" utility that could be applied to arrays of any type or rank:
|
||||||
```
|
```
|
||||||
interface
|
interface
|
||||||
subroutine clear(arr,bytes)
|
subroutine clear(arr,bytes)
|
||||||
|
@ -105,8 +105,8 @@ ENUM_CLASS(IgnoreTKR,
|
|||||||
Rank, // R - don't check ranks
|
Rank, // R - don't check ranks
|
||||||
Device, // D - don't check host/device residence
|
Device, // D - don't check host/device residence
|
||||||
Managed, // M - don't check managed storage
|
Managed, // M - don't check managed storage
|
||||||
Contiguous) // C - legacy; disabled NVFORTRAN's convention that leading
|
Contiguous) // C - don't check for storage sequence association with a
|
||||||
// dimension of assumed-shape was contiguous
|
// potentially non-contiguous object
|
||||||
using IgnoreTKRSet = EnumSet<IgnoreTKR, 8>;
|
using IgnoreTKRSet = EnumSet<IgnoreTKR, 8>;
|
||||||
// IGNORE_TKR(A) = IGNORE_TKR(TKRDM)
|
// IGNORE_TKR(A) = IGNORE_TKR(TKRDM)
|
||||||
static constexpr IgnoreTKRSet ignoreTKRAll{IgnoreTKR::Type, IgnoreTKR::Kind,
|
static constexpr IgnoreTKRSet ignoreTKRAll{IgnoreTKR::Type, IgnoreTKR::Kind,
|
||||||
|
@ -529,13 +529,15 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
|
|||||||
dummyName);
|
dummyName);
|
||||||
}
|
}
|
||||||
if (actualIsArrayElement && actualLastSymbol &&
|
if (actualIsArrayElement && actualLastSymbol &&
|
||||||
!evaluate::IsContiguous(*actualLastSymbol, foldingContext)) {
|
!evaluate::IsContiguous(*actualLastSymbol, foldingContext) &&
|
||||||
|
!dummy.ignoreTKR.test(common::IgnoreTKR::Contiguous)) {
|
||||||
if (IsPointer(*actualLastSymbol)) {
|
if (IsPointer(*actualLastSymbol)) {
|
||||||
basicError = true;
|
basicError = true;
|
||||||
messages.Say(
|
messages.Say(
|
||||||
"Element of pointer array may not be associated with a %s array"_err_en_US,
|
"Element of pointer array may not be associated with a %s array"_err_en_US,
|
||||||
dummyName);
|
dummyName);
|
||||||
} else if (IsAssumedShape(*actualLastSymbol)) {
|
} else if (IsAssumedShape(*actualLastSymbol) &&
|
||||||
|
!dummy.ignoreTKR.test(common::IgnoreTKR::Contiguous)) {
|
||||||
basicError = true;
|
basicError = true;
|
||||||
messages.Say(
|
messages.Say(
|
||||||
"Element of assumed-shape array may not be associated with a %s array"_err_en_US,
|
"Element of assumed-shape array may not be associated with a %s array"_err_en_US,
|
||||||
|
@ -746,11 +746,6 @@ void CheckHelper::CheckObjectEntity(
|
|||||||
messages_.Say(
|
messages_.Say(
|
||||||
"!DIR$ IGNORE_TKR may apply only in an interface or a module procedure"_err_en_US);
|
"!DIR$ IGNORE_TKR may apply only in an interface or a module procedure"_err_en_US);
|
||||||
}
|
}
|
||||||
if (ignoreTKR.test(common::IgnoreTKR::Contiguous) &&
|
|
||||||
!IsAssumedShape(symbol)) {
|
|
||||||
messages_.Say(
|
|
||||||
"!DIR$ IGNORE_TKR(C) may apply only to an assumed-shape array"_err_en_US);
|
|
||||||
}
|
|
||||||
if (ownerSymbol && ownerSymbol->attrs().test(Attr::ELEMENTAL) &&
|
if (ownerSymbol && ownerSymbol->attrs().test(Attr::ELEMENTAL) &&
|
||||||
details.ignoreTKR().test(common::IgnoreTKR::Rank)) {
|
details.ignoreTKR().test(common::IgnoreTKR::Rank)) {
|
||||||
messages_.Say(
|
messages_.Say(
|
||||||
|
@ -138,12 +138,6 @@ module m
|
|||||||
end block
|
end block
|
||||||
end
|
end
|
||||||
|
|
||||||
subroutine t21(x)
|
|
||||||
!dir$ ignore_tkr(c) x
|
|
||||||
!ERROR: !DIR$ IGNORE_TKR(C) may apply only to an assumed-shape array
|
|
||||||
real x(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
subroutine t22(x)
|
subroutine t22(x)
|
||||||
!dir$ ignore_tkr(r) x
|
!dir$ ignore_tkr(r) x
|
||||||
!WARNING: !DIR$ IGNORE_TKR(R) is not meaningful for an assumed-rank array
|
!WARNING: !DIR$ IGNORE_TKR(R) is not meaningful for an assumed-rank array
|
||||||
|
21
flang/test/Semantics/ignore_tkr03.f90
Normal file
21
flang/test/Semantics/ignore_tkr03.f90
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
|
||||||
|
module library
|
||||||
|
contains
|
||||||
|
subroutine lib_sub(buf)
|
||||||
|
!dir$ ignore_tkr(c) buf
|
||||||
|
real :: buf(1:*)
|
||||||
|
end subroutine
|
||||||
|
end module
|
||||||
|
|
||||||
|
module user
|
||||||
|
use library
|
||||||
|
contains
|
||||||
|
subroutine sub(var, ptr)
|
||||||
|
real :: var(:,:,:)
|
||||||
|
real, pointer :: ptr(:)
|
||||||
|
! CHECK: CALL lib_sub
|
||||||
|
call lib_sub(var(1, 2, 3))
|
||||||
|
! CHECK: CALL lib_sub
|
||||||
|
call lib_sub(ptr(1))
|
||||||
|
end subroutine
|
||||||
|
end module
|
Loading…
Reference in New Issue
Block a user