Skip to content

Commit 50a4073

Browse files
authored
[flang] Catch semantic error with LBOUND/UBOUND (llvm#154184)
The "ARRAY=" argument to these intrinsics cannot be scalar, whether "DIM=" is present or not. (Allowing the "ARRAY=" argument to be scalar when "DIM=" is absent would be a conceivable extension returning an empty result array, like SHAPE() does with extents, but it doesn't seem useful in a programming language without compilation-time rank polymorphism apart from assumed-rank dummy arguments, and those are supported.) Fixes llvm#154044.
1 parent 638f863 commit 50a4073

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

flang/lib/Evaluate/intrinsics.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
666666
{ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
667667
DefaultInt, Rank::elemental, IntrinsicClass::inquiryFunction},
668668
{"lbound",
669-
{{"array", AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
669+
{{"array", AnyData, Rank::arrayOrAssumedRank}, RequiredDIM,
670670
SizeDefaultKIND},
671671
KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
672672
{"lbound", {{"array", AnyData, Rank::arrayOrAssumedRank}, SizeDefaultKIND},
@@ -1034,7 +1034,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
10341034
{"trim", {{"string", SameCharNoLen, Rank::scalar}}, SameCharNoLen,
10351035
Rank::scalar, IntrinsicClass::transformationalFunction},
10361036
{"ubound",
1037-
{{"array", AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
1037+
{{"array", AnyData, Rank::arrayOrAssumedRank}, RequiredDIM,
10381038
SizeDefaultKIND},
10391039
KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
10401040
{"ubound", {{"array", AnyData, Rank::arrayOrAssumedRank}, SizeDefaultKIND},

flang/test/Evaluate/errors01.f90

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ module m
66
real x
77
end type t
88
contains
9-
subroutine s1(a,b,c)
10-
real :: a(*), b(:), c(..)
9+
subroutine s1(a,b,c,d)
10+
real :: a(*), b(:), c(..), d
1111
!CHECK: error: DIM=1 dimension is out of range for rank-1 assumed-size array
1212
integer :: ub1(ubound(a,1))
1313
!CHECK-NOT: error: DIM=1 dimension is out of range for rank-1 assumed-size array
@@ -23,7 +23,11 @@ subroutine s1(a,b,c)
2323
!CHECK: error: DIM=0 dimension must be positive
2424
integer :: lb4(lbound(c,0))
2525
!CHECK: error: DIM=666 dimension is too large for any array (maximum rank 15)
26-
integer :: lb4(lbound(c,666))
26+
integer :: lb5(lbound(c,666))
27+
!CHECK: error: 'array=' argument has unacceptable rank 0
28+
integer :: lb6(lbound(d,1))
29+
!CHECK: error: 'array=' argument has unacceptable rank 0
30+
integer :: ub4(ubound(d,1))
2731
end subroutine
2832
subroutine s2
2933
integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))

0 commit comments

Comments
 (0)