Skip to content

Conversation

klausler
Copy link
Contributor

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 #154044.

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.
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Aug 18, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 18, 2025

@llvm/pr-subscribers-flang-semantics

Author: Peter Klausler (klausler)

Changes

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 #154044.


Full diff: https://github.com/llvm/llvm-project/pull/154184.diff

2 Files Affected:

  • (modified) flang/lib/Evaluate/intrinsics.cpp (+2-2)
  • (modified) flang/test/Evaluate/errors01.f90 (+7-3)
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index c37a7f908d4d1..0f79ba6ed62b6 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -666,7 +666,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
             {ArgFlag::canBeMoldNull, ArgFlag::onlyConstantInquiry}}},
         DefaultInt, Rank::elemental, IntrinsicClass::inquiryFunction},
     {"lbound",
-        {{"array", AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
+        {{"array", AnyData, Rank::arrayOrAssumedRank}, RequiredDIM,
             SizeDefaultKIND},
         KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
     {"lbound", {{"array", AnyData, Rank::arrayOrAssumedRank}, SizeDefaultKIND},
@@ -1034,7 +1034,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
     {"trim", {{"string", SameCharNoLen, Rank::scalar}}, SameCharNoLen,
         Rank::scalar, IntrinsicClass::transformationalFunction},
     {"ubound",
-        {{"array", AnyData, Rank::anyOrAssumedRank}, RequiredDIM,
+        {{"array", AnyData, Rank::arrayOrAssumedRank}, RequiredDIM,
             SizeDefaultKIND},
         KINDInt, Rank::scalar, IntrinsicClass::inquiryFunction},
     {"ubound", {{"array", AnyData, Rank::arrayOrAssumedRank}, SizeDefaultKIND},
diff --git a/flang/test/Evaluate/errors01.f90 b/flang/test/Evaluate/errors01.f90
index b20922237f240..90a0c300e3567 100644
--- a/flang/test/Evaluate/errors01.f90
+++ b/flang/test/Evaluate/errors01.f90
@@ -6,8 +6,8 @@ module m
     real x
   end type t
  contains
-  subroutine s1(a,b,c)
-    real :: a(*), b(:), c(..)
+  subroutine s1(a,b,c,d)
+    real :: a(*), b(:), c(..), d
     !CHECK: error: DIM=1 dimension is out of range for rank-1 assumed-size array
     integer :: ub1(ubound(a,1))
     !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)
     !CHECK: error: DIM=0 dimension must be positive
     integer :: lb4(lbound(c,0))
     !CHECK: error: DIM=666 dimension is too large for any array (maximum rank 15)
-    integer :: lb4(lbound(c,666))
+    integer :: lb5(lbound(c,666))
+    !CHECK: error: 'array=' argument has unacceptable rank 0
+    integer :: lb6(lbound(d,1))
+    !CHECK: error: 'array=' argument has unacceptable rank 0
+    integer :: ub4(ubound(d,1))
   end subroutine
   subroutine s2
     integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))

@klausler klausler merged commit 50a4073 into llvm:main Aug 18, 2025
12 checks passed
@klausler klausler deleted the bug154044 branch August 18, 2025 21:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flang:semantics flang Flang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Flang] Compilation abnormally terminates when an array is not used as the first argument of LBOUND and UBOUND intrinsic functions
3 participants