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:
parent
87c66338d7
commit
073afca688
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
39
gcc/testsuite/gfortran.dg/class_nameclash.f90
Normal file
39
gcc/testsuite/gfortran.dg/class_nameclash.f90
Normal 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
|
Loading…
Reference in New Issue
Block a user