This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] Fix for multiple anonymous structures conflict with -fdec-structure


Found another silly typo in my structure/union patch.

With anonymous nested structures, as with unions and maps (which are
inherently anonymous), a static counter is used to give each type
definition a unique name. Due to a typo the counter for anonymous
structures was not static, therefore was simply zero for each
invocation of decl.c (gfc_match_structure_decl). Thus only one
anonymous structure declaration could be used per program, as multiple
anonymous structure definitions would be given the same name, causing
the compiler to complain about conflicting type definitions.

Committed the attached as obvious as r239709 - includes testcase
exhibiting the regression.

---
Fritz Reese

2016-08-23  Fritz Reese  <fritzoreese@gmail.com>

        gcc/fortran/
        * decl.c (gfc_match_structure_decl): Make gfc_structure_id static.

        gcc/testsuite/gfortran.dg/
        * dec_structure_12.f90: New testcase.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 66158b9..24bd374 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -8626,7 +8626,7 @@ match
 gfc_match_structure_decl (void)
 {
     /* Counter used to give unique internal names to anonymous structures.  */
-    int gfc_structure_id = 0;
+    static unsigned int gfc_structure_id = 0;
     char name[GFC_MAX_SYMBOL_LEN + 1];
     gfc_symbol *sym;
     match m;
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_12.f90 b/gcc/testsuite/gfortran.dg/dec_structure_12.f90
new file mode 100644
index 0000000..b6cc5aa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dec_structure_12.f90
@@ -0,0 +1,27 @@
+! { dg-do "compile" }
+! { dg-options "-fdec-structure" }
+!
+! Test a regression where multiple anonymous structures failed to
+! receive unique internal names.
+!
+
+implicit none
+
+structure /s/
+
+  structure record0 ! (2)
+    integer i
+  end structure
+
+  structure record1 ! regression: Type definition was already defined at (2)
+    real r
+  end structure
+
+end structure
+
+record /s/ var
+
+var.record0.i = 0
+var.record1.r = 0.0
+
+end

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]