2020-11-14 01:31:41 +08:00
|
|
|
! RUN: %S/test_errors.sh %s %t %f18
|
|
|
|
! Test comparisons that use the intrinsic SHAPE() as an operand
|
|
|
|
program testShape
|
|
|
|
contains
|
|
|
|
subroutine sub1(arrayDummy)
|
|
|
|
integer :: arrayDummy(:)
|
|
|
|
integer, allocatable :: arrayDeferred(:)
|
|
|
|
integer :: arrayLocal(2) = [88, 99]
|
[flang] Fix classification of shape inquiries in specification exprs
In some contexts, including the motivating case of determining whether
the expressions that define the shape of a variable are "constant expressions"
in the sense of the Fortran standard, expression rewriting via Fold()
is not necessary, and should not be required. The inquiry intrinsics LBOUND,
UBOUND, and SIZE work correctly now in specification expressions and are
classified correctly as being constant expressions (or not). Getting this right
led to a fair amount of API clean-up as a consequence, including the
folding of shapes and TypeAndShape objects, and new APIs for shapes
that do not fold for those cases where folding isn't needed. Further,
the symbol-testing predicate APIs in Evaluate/tools.h now all resolve any
associations of their symbols and work transparently on use-, host-, and
construct-association symbols; the tools used to resolve those associations have
been defined and documented more precisely, and their clients adjusted as needed.
Differential Revision: https://reviews.llvm.org/D94561
2021-01-13 07:36:45 +08:00
|
|
|
!ERROR: Dimension 1 of left operand has extent 1, but right operand has extent 0
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 1, but right operand has extent 0
|
2020-11-14 01:31:41 +08:00
|
|
|
if (all(shape(arrayDummy)==shape(8))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
[flang] Fix classification of shape inquiries in specification exprs
In some contexts, including the motivating case of determining whether
the expressions that define the shape of a variable are "constant expressions"
in the sense of the Fortran standard, expression rewriting via Fold()
is not necessary, and should not be required. The inquiry intrinsics LBOUND,
UBOUND, and SIZE work correctly now in specification expressions and are
classified correctly as being constant expressions (or not). Getting this right
led to a fair amount of API clean-up as a consequence, including the
folding of shapes and TypeAndShape objects, and new APIs for shapes
that do not fold for those cases where folding isn't needed. Further,
the symbol-testing predicate APIs in Evaluate/tools.h now all resolve any
associations of their symbols and work transparently on use-, host-, and
construct-association symbols; the tools used to resolve those associations have
been defined and documented more precisely, and their clients adjusted as needed.
Differential Revision: https://reviews.llvm.org/D94561
2021-01-13 07:36:45 +08:00
|
|
|
!ERROR: Dimension 1 of left operand has extent 0, but right operand has extent 1
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 0, but right operand has extent 1
|
2020-11-14 01:31:41 +08:00
|
|
|
if (all(shape(27)==shape(arrayDummy))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
|
|
|
if (all(64==shape(arrayDummy))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
[flang] Fix classification of shape inquiries in specification exprs
In some contexts, including the motivating case of determining whether
the expressions that define the shape of a variable are "constant expressions"
in the sense of the Fortran standard, expression rewriting via Fold()
is not necessary, and should not be required. The inquiry intrinsics LBOUND,
UBOUND, and SIZE work correctly now in specification expressions and are
classified correctly as being constant expressions (or not). Getting this right
led to a fair amount of API clean-up as a consequence, including the
folding of shapes and TypeAndShape objects, and new APIs for shapes
that do not fold for those cases where folding isn't needed. Further,
the symbol-testing predicate APIs in Evaluate/tools.h now all resolve any
associations of their symbols and work transparently on use-, host-, and
construct-association symbols; the tools used to resolve those associations have
been defined and documented more precisely, and their clients adjusted as needed.
Differential Revision: https://reviews.llvm.org/D94561
2021-01-13 07:36:45 +08:00
|
|
|
!ERROR: Dimension 1 of left operand has extent 1, but right operand has extent 0
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 1, but right operand has extent 0
|
2020-11-14 01:31:41 +08:00
|
|
|
if (all(shape(arrayDeferred)==shape(8))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
[flang] Fix classification of shape inquiries in specification exprs
In some contexts, including the motivating case of determining whether
the expressions that define the shape of a variable are "constant expressions"
in the sense of the Fortran standard, expression rewriting via Fold()
is not necessary, and should not be required. The inquiry intrinsics LBOUND,
UBOUND, and SIZE work correctly now in specification expressions and are
classified correctly as being constant expressions (or not). Getting this right
led to a fair amount of API clean-up as a consequence, including the
folding of shapes and TypeAndShape objects, and new APIs for shapes
that do not fold for those cases where folding isn't needed. Further,
the symbol-testing predicate APIs in Evaluate/tools.h now all resolve any
associations of their symbols and work transparently on use-, host-, and
construct-association symbols; the tools used to resolve those associations have
been defined and documented more precisely, and their clients adjusted as needed.
Differential Revision: https://reviews.llvm.org/D94561
2021-01-13 07:36:45 +08:00
|
|
|
!ERROR: Dimension 1 of left operand has extent 0, but right operand has extent 1
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 0, but right operand has extent 1
|
2020-11-14 01:31:41 +08:00
|
|
|
if (all(shape(27)==shape(arrayDeferred))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
|
|
|
if (all(64==shape(arrayDeferred))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 1, but right operand has extent 0
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 1, but right operand has extent 0
|
|
|
|
if (all(shape(arrayLocal)==shape(8))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 0, but right operand has extent 1
|
|
|
|
!ERROR: Dimension 1 of left operand has extent 0, but right operand has extent 1
|
|
|
|
if (all(shape(27)==shape(arrayLocal))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
|
|
|
if (all(64==shape(arrayLocal))) then
|
|
|
|
print *, "hello"
|
|
|
|
end if
|
|
|
|
end subroutine sub1
|
|
|
|
end program testShape
|