class.c (gfc_build_class_symbol): Append "_t" to target class names to make the generated type names unique.

gcc:
2014-04-10  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * fortran/class.c (gfc_build_class_symbol): Append "_t" to target class
        names to make the generated type names unique.

testsuite:
2014-04-10  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * gfortran.dg/class_nameclash.f90: New test.

From-SVN: r209277
This commit is contained in:
Bernd Edlinger 2014-04-10 14:40:25 +00:00 committed by Bernd Edlinger
parent 87c66338d7
commit 073afca688
4 changed files with 50 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2014-04-10 Bernd Edlinger <bernd.edlinger@hotmail.de>
* fortran/class.c (gfc_build_class_symbol): Append "_t" to target class
names to make the generated type names unique.
2014-04-10 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR debug/60655

View File

@ -588,13 +588,13 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
else if ((*as) && attr->pointer)
sprintf (name, "__class_%s_%d_%dp", tname, rank, (*as)->corank);
else if ((*as))
sprintf (name, "__class_%s_%d_%d", tname, rank, (*as)->corank);
sprintf (name, "__class_%s_%d_%dt", tname, rank, (*as)->corank);
else if (attr->pointer)
sprintf (name, "__class_%s_p", tname);
else if (attr->allocatable)
sprintf (name, "__class_%s_a", tname);
else
sprintf (name, "__class_%s", tname);
sprintf (name, "__class_%s_t", tname);
if (ts->u.derived->attr.unlimited_polymorphic)
{

View File

@ -1,3 +1,7 @@
2014-04-10 Bernd Edlinger <bernd.edlinger@hotmail.de>
* gfortran.dg/class_nameclash.f90: New test.
2014-04-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/52844

View File

@ -0,0 +1,39 @@
! { dg-do run }
!
! try to provoke class name clashes in gfc_build_class_symbol
!
module test_module
implicit none
type, public :: test_p
private
class (test_p), pointer :: next => null()
end type test_p
type, public :: test
! Error in "call do_it (x)" below:
! Type mismatch in argument 'x' at (1); passed CLASS(test_p) to CLASS(test)
class (test), pointer :: next => null()
end type test
contains
subroutine do_it (x)
class (test_p), target :: x
x%next => x
return
end subroutine do_it
end module test_module
use test_module
implicit none
class (test_p), pointer :: x
allocate (x)
call do_it (x)
deallocate (x)
end