return Result{1};
}
- Result operator()(const Symbol &symbol0) const {
+ Result GetLowerBound(const Symbol &symbol0, NamedEntity &&base) const {
const Symbol &symbol{symbol0.GetUltimate()};
if (const auto *details{
symbol.detailsIf<semantics::ObjectEntityDetails>()}) {
}
}
if (IsDescriptor(symbol)) {
- return ExtentExpr{DescriptorInquiry{NamedEntity{symbol0},
+ return ExtentExpr{DescriptorInquiry{std::move(base),
DescriptorInquiry::Field::LowerBound, dimension_}};
}
}
if (assoc->rank()) { // SELECT RANK case
const Symbol &resolved{ResolveAssociations(symbol)};
if (IsDescriptor(resolved) && dimension_ < *assoc->rank()) {
- return ExtentExpr{DescriptorInquiry{NamedEntity{symbol0},
+ return ExtentExpr{DescriptorInquiry{std::move(base),
DescriptorInquiry::Field::LowerBound, dimension_}};
}
} else {
}
}
+ Result operator()(const Symbol &symbol0) const {
+ return GetLowerBound(symbol0, NamedEntity{symbol0});
+ }
+
Result operator()(const Component &component) const {
if (component.base().Rank() == 0) {
- return (*this)(component.GetLastSymbol());
+ return GetLowerBound(
+ component.GetLastSymbol(), NamedEntity{common::Clone(component)});
}
return Result{1};
}
subroutine ubound_test(x, n, m)
integer :: x(n, m)
integer :: y(0:n, 0:m) ! UBOUND could be 0 if n or m are < 0
- !CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1),kind=4),int(size(x,dim=2),kind=4)]
+ !CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1,kind=8),kind=4),int(size(x,dim=2,kind=8),kind=4)]
print *, ubound(x)
!CHECK: PRINT *, ubound(returns_array(n,m))
print *, ubound(returns_array(n, m))
subroutine size_test(x, n, m)
integer :: x(n, m)
- !CHECK: PRINT *, int(size(x,dim=1)*size(x,dim=2),kind=4)
+ !CHECK: PRINT *, int(size(x,dim=1,kind=8)*size(x,dim=2,kind=8),kind=4)
print *, size(x)
!CHECK: PRINT *, size(returns_array(n,m))
print *, size(returns_array(n, m))
subroutine shape_test(x, n, m)
integer :: x(n, m)
- !CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1),kind=4),int(size(x,dim=2),kind=4)]
+ !CHECK: PRINT *, [INTEGER(4)::int(size(x,dim=1,kind=8),kind=4),int(size(x,dim=2,kind=8),kind=4)]
print *, shape(x)
!CHECK: PRINT *, shape(returns_array(n,m))
print *, shape(returns_array(n, m))
subroutine lbound_test(x, n, m)
integer :: x(n, m)
integer :: y(0:n, 0:m) ! LBOUND could be 1 if n or m are < 0
+ type t
+ real, pointer :: p(:, :)
+ end type
+ type(t) :: a(10)
!CHECK: PRINT *, [INTEGER(4)::1_4,1_4]
print *, lbound(x)
!CHECK: PRINT *, [INTEGER(4)::1_4,1_4]
print *, lbound(y)
!CHECK: PRINT *, lbound(y,1_4)
print *, lbound(y, 1)
+ !CHECK: PRINT *, lbound(a(1_8)%p,dim=1,kind=8)
+ print *, lbound(a(1)%p, 1, kind=8)
end subroutine
!CHECK: len_test
integer, intent(in) :: n, m
character(n), intent(in) :: e
- !CHECK: PRINT *, int(a%len,kind=4)
- print *, len(a)
+ !CHECK: PRINT *, int(a%len,kind=8)
+ print *, len(a, kind=8)
!CHECK: PRINT *, 5_4
print *, len(a(1:5))
!CHECK: PRINT *, len(b(a))