public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/99266] New: CLASS array/dimension handling does not work - when DIMENSION comes in an extra line
@ 2021-02-25 10:43 burnus at gcc dot gnu.org
  2021-02-25 10:46 ` [Bug fortran/99266] " burnus at gcc dot gnu.org
  2021-02-25 11:10 ` burnus at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: burnus at gcc dot gnu.org @ 2021-02-25 10:43 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99266

            Bug ID: 99266
           Summary: CLASS array/dimension handling does not work - when
                    DIMENSION comes in an extra line
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, rejects-valid
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
  Target Milestone: ---

Found when looking at PR99254 & PR99138.

For 's2':
  f951: internal compiler error: find_array_spec(): Missing spec

For 's1':
  Error: The SELECT RANK selector at (1) must be an assumed rank variable

implicit none (type, external)
integer :: a(5)
call s1(a)
call s2(a)
contains
!subroutine s1(x)
!   class(*) :: x
!   dimension :: x(..)
!   select rank (y=>x)
!   rank (1)
!      ! OK
!   rank(*)
!      stop 1
!   end select
!end
subroutine s2(x)
   class(*) :: x
   dimension :: x(:)
   select type (y=>x)
   type is (integer)
     x(1) = 5
   class default
      stop 1
   end select
end
end

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug fortran/99266] CLASS array/dimension handling does not work - when DIMENSION comes in an extra line
  2021-02-25 10:43 [Bug fortran/99266] New: CLASS array/dimension handling does not work - when DIMENSION comes in an extra line burnus at gcc dot gnu.org
@ 2021-02-25 10:46 ` burnus at gcc dot gnu.org
  2021-02-25 11:10 ` burnus at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: burnus at gcc dot gnu.org @ 2021-02-25 10:46 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99266

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> ---
I tried to add to gfc_build_class_symbol:

  if (attr->class_ok
      && ((attr->allocatable && !ts->u.derived->components->attr.allocatable)
          || (attr->pointer && !ts->u.derived->components->attr.class_pointer)
          || (*as && !ts->u.derived->components->as)
          || (attr->dimension && !ts->u.derived->components->attr.dimension)
          || (attr->codimension
              && !ts->u.derived->components->attr.codimension)))
    attr->class_ok = 0;

but that did not work - For 's2', dimension == 1 but *as == NULL !!!

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug fortran/99266] CLASS array/dimension handling does not work - when DIMENSION comes in an extra line
  2021-02-25 10:43 [Bug fortran/99266] New: CLASS array/dimension handling does not work - when DIMENSION comes in an extra line burnus at gcc dot gnu.org
  2021-02-25 10:46 ` [Bug fortran/99266] " burnus at gcc dot gnu.org
@ 2021-02-25 11:10 ` burnus at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: burnus at gcc dot gnu.org @ 2021-02-25 11:10 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99266

--- Comment #2 from Tobias Burnus <burnus at gcc dot gnu.org> ---
subroutine foo(dummy)
  class(*) :: dummy
  allocatable :: dummy
end

gets rejected with:
Error: ALLOCATABLE attribute conflicts with POINTER attribute at (1)

The following is accepted, except after the patch proposed for PR99254:
  subroutine foo
    class(*) :: local
    allocatable :: local
  end

The reason is how 'class_ok = ' is set. – And in general, the issue is due to
how attributes are checked.

NOTE: If attributes change after the symbol is used, we may create unused
derived types, which is hopefully harmless.


The following is also a bit odd:
  rank = !(*as) || (*as)->rank == -1 ? GFC_MAX_DIMENSIONS : (*as)->rank;
why do become become scalars (as == NULL) rank = 15 but not coarray scalars
rank == 0?

Shouldn't this be:  rank = (!(*as) ? 0 : (...rank == -1 ? ...MAX... : ...rank))
?

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-02-25 11:10 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-25 10:43 [Bug fortran/99266] New: CLASS array/dimension handling does not work - when DIMENSION comes in an extra line burnus at gcc dot gnu.org
2021-02-25 10:46 ` [Bug fortran/99266] " burnus at gcc dot gnu.org
2021-02-25 11:10 ` burnus at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).