public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "pault at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug fortran/59198] [4.7/4.8/4.9 Regression] ICE on cyclically dependent polymorphic types
Date: Sat, 22 Feb 2014 13:35:00 -0000	[thread overview]
Message-ID: <bug-59198-4-6kwLUcszKR@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-59198-4@http.gcc.gnu.org/bugzilla/>

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59198

Paul Thomas <pault at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pault at gcc dot gnu.org

--- Comment #6 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to janus from comment #5)

This one is intriguing! If the ICE is avoided by:
Index: gcc/varasm.c
===================================================================
*** gcc/varasm.c    (revision 208017)
--- gcc/varasm.c    (working copy)
*************** output_constructor_regular_field (oc_loc
*** 4930,4938 ****
        /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
       but we cannot do this until the deprecated support for
       initializing zero-length array members is removed.  */
!       if (TREE_CODE (TREE_TYPE (local->field)) == ARRAY_TYPE
        && TYPE_DOMAIN (TREE_TYPE (local->field))
        && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (local->field))))
      {
        fieldsize = array_size_for_constructor (local->val);
        /* Given a non-empty initialization, this field had
--- 4930,4939 ----
        /* ??? This ought to only checked if DECL_SIZE_UNIT is NULL,
       but we cannot do this until the deprecated support for
       initializing zero-length array members is removed.  */
!       if ((TREE_CODE (TREE_TYPE (local->field)) == ARRAY_TYPE
        && TYPE_DOMAIN (TREE_TYPE (local->field))
        && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (local->field))))
+       || DECL_SIZE_UNIT (local->field) == NULL_TREE)
      {
        fieldsize = array_size_for_constructor (local->val);
        /* Given a non-empty initialization, this field had


The examples compile.  However,
module decays

  implicit none

  type :: decay_term_t
     type(decay_t), pointer :: unstable_product
  end type

  type :: decay_gen_t
     type(decay_term_t), allocatable :: term
     procedure(sin), nopass, pointer :: obs1_int
  end type

  type :: rng_t
  end type

  type, extends (decay_gen_t) :: decay_t
     class(rng_t), allocatable :: rng
  end type

  class(decay_t), pointer :: object

end

  use decays
  type(decay_t), pointer :: template
  allocate (template)
  allocate (template%rng)
  template%obs1_int => sin
  allocate (object, mold = template)
  object%obs1_int => sin
  print *, object%obs1_int (3.14159/2.)
end

runs and gives the correct result.  If 'mold' is changed to 'source', the
programme segfaults, with:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x41372D in _gfortrani_backtrace at backtrace.c:258
#1  0x402DB0 in _gfortrani_backtrace_handler at compile_options.c:129
#2  0x378B2359AF
#3  0x402658 in __decays_MOD___copy_decays_Decay_t
#4  0x402CAD in MAIN__ at pr59198.f90:0
Segmentation fault (core dumped)

Making the component, 'rng' a pointer restores the expected outcome by
eliminating the call to _def_init_decays_Decay_t. The difference in the code
that this copy procedure produces is:
        if (src->rng._data != 0B)
          {
            dst->rng._data = (struct rng_t *) __builtin_malloc ((unsigned long)
src->rng._vptr->_size);
            src->rng._vptr->_copy (src->rng._data, dst->rng._data);
          }
        else
          {
            dst->rng._data = 0B;
          }

This is as far as I have gone in diagnosing the problem. By the way, though,
even without the patch to varasm.c, changing rng to a pointer fixes the
problem.

I have just noticed that my fix to varasm.c should have gone pear-shaped
because there are no arrays, anywhere to be seen. Stranger and stranger.

Paul


  parent reply	other threads:[~2014-02-22 13:35 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-20  2:30 [Bug fortran/59198] New: " juergen.reuter at desy dot de
2013-11-20 14:40 ` [Bug fortran/59198] [4.7/4.8/4.9 Regression] " janus at gcc dot gnu.org
2013-11-20 15:55 ` janus at gcc dot gnu.org
2013-12-19 15:20 ` rguenth at gcc dot gnu.org
2013-12-19 15:33 ` rguenth at gcc dot gnu.org
2014-01-19 21:31 ` mikael at gcc dot gnu.org
2014-02-09 17:50 ` janus at gcc dot gnu.org
2014-02-22 13:35 ` pault at gcc dot gnu.org [this message]
2014-02-22 15:35 ` burnus at gcc dot gnu.org
2014-02-22 16:02 ` paul.richard.thomas at gmail dot com
2014-02-24  9:20 ` paul.richard.thomas at gmail dot com
2014-02-25  9:31 ` pault at gcc dot gnu.org
2014-02-25 13:44 ` paul.richard.thomas at gmail dot com
2014-02-25 20:23 ` pault at gcc dot gnu.org
2014-06-12 13:46 ` [Bug fortran/59198] [4.7/4.8/4.9/4.10 " rguenth at gcc dot gnu.org
2014-12-19 13:40 ` [Bug fortran/59198] [4.8/4.9/5 " jakub at gcc dot gnu.org
2014-12-26 15:59 ` paul.richard.thomas at gmail dot com
2014-12-26 16:25 ` dominiq at lps dot ens.fr
2015-02-17  9:39 ` dominiq at lps dot ens.fr
2015-03-16  8:45 ` pault at gcc dot gnu.org
2015-03-16 11:26 ` juergen.reuter at desy dot de
2015-03-17  5:20 ` pault at gcc dot gnu.org
2015-03-18 20:22 ` [Bug fortran/59198] [4.8/4.9 " anlauf at gmx dot de
2015-03-18 21:19 ` pault at gcc dot gnu.org
2015-03-19 22:23 ` pault at gcc dot gnu.org
2015-06-23  8:47 ` [Bug fortran/59198] [4.8 " rguenth at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-59198-4-6kwLUcszKR@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).