The PR is originally about a bogus warning, which turned out to originate
from truncation of mangled names.  Fix: simply extend temporaries to hold
all possible allowed values (which would enable 2^31 equivalences).

Regtested on x86_64-pc-linux-gnu.

The testcase checks the presence of properly generated mangled names
in the assembler.  If this should be restricted to x86-type systems,
I can adjust that.

OK for master?

Thanks,
Harald


PR fortran/95106 - truncation of long symbol names with EQUIVALENCE

        For long module names, the generated name-mangled symbol was
        truncated, leading to bogus warnings about COMMON block
        mismatches.  Provide sufficiently large temporaries.

gcc/fortran/

2020-05-22  Harald Anlauf  <anl...@gmx.de>

        PR fortran/95106
        * trans-common.c (gfc_sym_mangled_common_id): Enlarge temporaries
        for name-mangling.

gcc/testsuite/

2020-05-22  Harald Anlauf  <anl...@gmx.de>

        PR fortran/95106
        * gfortran.dg/equiv_11.f90: New test.
diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index bf163bc4f52..3775a8bea74 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -242,8 +242,9 @@ static tree
 gfc_sym_mangled_common_id (gfc_common_head *com)
 {
   int has_underscore;
-  char mangled_name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
-  char name[GFC_MAX_SYMBOL_LEN + 1];
+  /* Provide sufficient space to hold "symbol.eq.1234567890__".  */
+  char mangled_name[GFC_MAX_MANGLED_SYMBOL_LEN + 1 + 16];
+  char name[GFC_MAX_SYMBOL_LEN + 1 + 16];

   /* Get the name out of the common block pointer.  */
   strcpy (name, com->name);
diff --git a/gcc/testsuite/gfortran.dg/equiv_11.f90 b/gcc/testsuite/gfortran.dg/equiv_11.f90
new file mode 100644
index 00000000000..0f4a1ab5c32
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/equiv_11.f90
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-fsecond-underscore" }
+! PR fortran/95106
+
+module m2345678901234567890123456789012345678901234567890123456789_123
+  implicit none
+  real :: a(4), u(3,2)
+  real :: b(4), v(4,2)
+  equivalence (a(1),u(1,1)), (b(1),v(1,1))
+end
+! { dg-final { scan-assembler {m2345678901234567890123456789012345678901234567890123456789_123.eq.0__} } }
+! { dg-final { scan-assembler {m2345678901234567890123456789012345678901234567890123456789_123.eq.1__} } }

Reply via email to