diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2014-04-10 14:40:25 +0000 |
---|---|---|
committer | Bernd Edlinger <edlinger@gcc.gnu.org> | 2014-04-10 14:40:25 +0000 |
commit | 073afca6884441dd85e6a5a55acd61c9d1442f7a (patch) | |
tree | d34c46f09ccc1c256abc8aba5e04ec0e2c2a362a /gcc | |
parent | 87c66338d77671f0c562febddb15eb6890ea196f (diff) | |
download | gcc-073afca6884441dd85e6a5a55acd61c9d1442f7a.zip gcc-073afca6884441dd85e6a5a55acd61c9d1442f7a.tar.gz gcc-073afca6884441dd85e6a5a55acd61c9d1442f7a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fortran/class.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/class_nameclash.f90 | 39 |
4 files changed, 50 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e1ef1f..89f4e04 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index d01d7d8..346aee6 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -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) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7cab549..4db6ed0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gfortran.dg/class_nameclash.f90 b/gcc/testsuite/gfortran.dg/class_nameclash.f90 new file mode 100644 index 0000000..227d865 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_nameclash.f90 @@ -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 |