+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
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)
{
+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
--- /dev/null
+! { 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