public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, Fortran] PR fortran/45783 and PR fortran/45795: Fix ICE in gfc_add_component_ref
@ 2010-09-27  9:31 Daniel Kraft
  2010-09-27  9:55 ` Jerry DeLisle
  0 siblings, 1 reply; 3+ messages in thread
From: Daniel Kraft @ 2010-09-27  9:31 UTC (permalink / raw)
  To: Fortran List, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 677 bytes --]

Hi,

this trivial patch fixes the two PRs about ICE in gfc_add_component_ref. 
  I only added the test-case from PR 45795, but I think this is enough 
and ok.  The problem was that my definability patch changed the order of 
resolution for SELECT TYPE vs. its contained code, and this uncovered a 
bug introduced when I changed SELECT TYPE to use ASSOCIATE logic 
internally.  Namely, that the associate-name gets its target's typespec 
-- this is wrong for SELECT TYPE obviously.

I will regtest now on x86_64-unknown-linux-gnu.  Ok for trunk if no 
failures?

Yours,
Daniel

-- 
http://www.pro-vegan.info/
--
Done:  Arc-Bar-Cav-Kni-Ran-Rog-Sam-Tou-Val-Wiz
To go: Hea-Mon-Pri

[-- Attachment #2: patch.changelog --]
[-- Type: text/plain, Size: 316 bytes --]

2010-09-26  Daniel Kraft  <d@domob.eu>

	PR fortran/45783
	PR fortran/45795
	* resolve.c (resolve_select_type): Clarify code.
	(resolve_assoc_var): Only set typespec if it is currently unknown.

2010-09-26  Daniel Kraft  <d@domob.eu>

	PR fortran/45783
	PR fortran/45795
	* gfortran.dg/select_type_18.f03: New test.

[-- Attachment #3: patch.diff --]
[-- Type: text/plain, Size: 3044 bytes --]

Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 164634)
+++ gcc/fortran/resolve.c	(working copy)
@@ -7570,7 +7570,11 @@ resolve_assoc_var (gfc_symbol* sym, bool
       sym->attr.target = (tsym->attr.target || tsym->attr.pointer);
     }
 
-  sym->ts = target->ts;
+  /* Get type if this was not already set.  Note that it can be
+     some other type than the target in case this is a SELECT TYPE
+     selector!  So we must not update when the type is already there.  */
+  if (sym->ts.type == BT_UNKNOWN)
+    sym->ts = target->ts;
   gcc_assert (sym->ts.type != BT_UNKNOWN);
 
   /* See if this is a valid association-to-variable.  */
@@ -7673,8 +7677,8 @@ resolve_select_type (gfc_code *code, gfc
 	      error++;
 	      continue;
 	    }
-	  else
-	    default_case = body;
+
+	  default_case = body;
 	}
     }
     
Index: gcc/testsuite/gfortran.dg/select_type_18.f03
===================================================================
--- gcc/testsuite/gfortran.dg/select_type_18.f03	(revision 0)
+++ gcc/testsuite/gfortran.dg/select_type_18.f03	(revision 0)
@@ -0,0 +1,90 @@
+! { dg-do compile }
+
+! PR fortran/45783
+! PR fortran/45795
+! This used to fail because of incorrect compile-time typespec on the
+! SELECT TYPE selector.
+
+! This is the test-case from PR 45795.
+! Contributed by Salvatore Filippone, sfilippone@uniroma2.it.
+
+module base_mod
+  
+  type  :: base
+    integer     :: m, n
+  end type base
+
+end module base_mod
+
+module s_base_mod
+  
+  use base_mod
+
+  type, extends(base) :: s_base
+  contains
+    procedure, pass(a) :: cp_to_foo   => s_base_cp_to_foo   
+    
+  end type s_base
+  
+  
+  type, extends(s_base) :: s_foo
+    
+    integer              :: nnz
+    integer, allocatable :: ia(:), ja(:)
+    real, allocatable :: val(:)
+    
+  contains
+    
+    procedure, pass(a) :: cp_to_foo    => s_cp_foo_to_foo
+    
+  end type s_foo
+  
+  
+  interface 
+    subroutine s_base_cp_to_foo(a,b,info) 
+      import :: s_base, s_foo
+      class(s_base), intent(in) :: a
+      class(s_foo), intent(inout) :: b
+      integer, intent(out)            :: info
+    end subroutine s_base_cp_to_foo
+  end interface
+  
+  interface 
+    subroutine s_cp_foo_to_foo(a,b,info) 
+      import :: s_foo
+      class(s_foo), intent(in) :: a
+      class(s_foo), intent(inout) :: b
+      integer, intent(out)            :: info
+    end subroutine s_cp_foo_to_foo
+  end interface
+
+end module s_base_mod
+
+
+subroutine trans2(a,b)
+  use s_base_mod
+  implicit none 
+
+  class(s_base), intent(out) :: a
+  class(base), intent(in)   :: b
+
+  type(s_foo) :: tmp
+  integer err_act, info
+
+
+  info = 0
+  select type(b)
+  class is (s_base)
+    call b%cp_to_foo(tmp,info)
+  class default
+    info = -1
+    write(*,*) 'Invalid dynamic type'
+  end select
+  
+  if (info /= 0) write(*,*) 'Error code ',info
+
+  return
+
+end subroutine trans2
+
+! { dg-final { cleanup-modules "base_mod s_base_mod" } }

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

* Re: [Patch, Fortran] PR fortran/45783 and PR fortran/45795: Fix ICE in gfc_add_component_ref
  2010-09-27  9:31 [Patch, Fortran] PR fortran/45783 and PR fortran/45795: Fix ICE in gfc_add_component_ref Daniel Kraft
@ 2010-09-27  9:55 ` Jerry DeLisle
  2010-09-27 11:31   ` Daniel Kraft
  0 siblings, 1 reply; 3+ messages in thread
From: Jerry DeLisle @ 2010-09-27  9:55 UTC (permalink / raw)
  To: Daniel Kraft; +Cc: Fortran List, gcc-patches

On 09/26/2010 11:42 AM, Daniel Kraft wrote:
> Hi,
>
> this trivial patch fixes the two PRs about ICE in gfc_add_component_ref. I only
> added the test-case from PR 45795, but I think this is enough and ok. The
> problem was that my definability patch changed the order of resolution for
> SELECT TYPE vs. its contained code, and this uncovered a bug introduced when I
> changed SELECT TYPE to use ASSOCIATE logic internally. Namely, that the
> associate-name gets its target's typespec -- this is wrong for SELECT TYPE
> obviously.
>
> I will regtest now on x86_64-unknown-linux-gnu. Ok for trunk if no failures?

Ok if regression tests pass.

Jerry

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

* Re: [Patch, Fortran] PR fortran/45783 and PR fortran/45795: Fix ICE in gfc_add_component_ref
  2010-09-27  9:55 ` Jerry DeLisle
@ 2010-09-27 11:31   ` Daniel Kraft
  0 siblings, 0 replies; 3+ messages in thread
From: Daniel Kraft @ 2010-09-27 11:31 UTC (permalink / raw)
  To: Jerry DeLisle; +Cc: Fortran List, gcc-patches

Jerry DeLisle wrote:
> On 09/26/2010 11:42 AM, Daniel Kraft wrote:
>> Hi,
>>
>> this trivial patch fixes the two PRs about ICE in 
>> gfc_add_component_ref. I only
>> added the test-case from PR 45795, but I think this is enough and ok. The
>> problem was that my definability patch changed the order of resolution 
>> for
>> SELECT TYPE vs. its contained code, and this uncovered a bug 
>> introduced when I
>> changed SELECT TYPE to use ASSOCIATE logic internally. Namely, that the
>> associate-name gets its target's typespec -- this is wrong for SELECT 
>> TYPE
>> obviously.
>>
>> I will regtest now on x86_64-unknown-linux-gnu. Ok for trunk if no 
>> failures?
> 
> Ok if regression tests pass.

No failures.

Committed revision 164638.

Thanks for the review!

Daniel

-- 
http://www.pro-vegan.info/
--
Done:  Arc-Bar-Cav-Kni-Ran-Rog-Sam-Tou-Val-Wiz
To go: Hea-Mon-Pri

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

end of thread, other threads:[~2010-09-26 19:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-27  9:31 [Patch, Fortran] PR fortran/45783 and PR fortran/45795: Fix ICE in gfc_add_component_ref Daniel Kraft
2010-09-27  9:55 ` Jerry DeLisle
2010-09-27 11:31   ` Daniel Kraft

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).