]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/60526 (Accepts-invalid: Variable name same as type name)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 14 Feb 2016 17:08:44 +0000 (17:08 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 14 Feb 2016 17:08:44 +0000 (17:08 +0000)
2016-02-14  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/60526
* decl.c (build_sym):  If the name has already been defined as a
type, it has a symtree with an upper case letter at the beginning.
If such a symtree exists, issue an error and exit.  Don't do
this if there is no corresponding upper case letter.

2016-02-14  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/60526
* gfortran.dg/type_decl_4.f90:  Reinstated.

From-SVN: r233413

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/type_decl_4.f90 [new file with mode: 0644]

index aa4a0288ee00e9f1d7e3afc674985bffd7b0e01a..453e72a33a1958d4a259b66a3ee12a921d4c45ac 100644 (file)
@@ -1,3 +1,11 @@
+2016-02-14  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/60526
+       * decl.c (build_sym):  If the name has already been defined as a
+       type, it has a symtree with an upper case letter at the beginning.
+       If such a symtree exists, issue an error and exit.  Don't do
+       this if there is no corresponding upper case letter.
+
 2016-02-14  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/60526
index df813697a0251389e4b4611f75cd63e6648d1441..d3ddda2d5f54c20a205ecbab31c659128bd2234c 100644 (file)
@@ -1215,10 +1215,38 @@ build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
 {
   symbol_attribute attr;
   gfc_symbol *sym;
+  int upper;
 
   if (gfc_get_symbol (name, NULL, &sym))
     return false;
 
+  /* Check if the name has already been defined as a type.  The
+     first letter of the symtree will be in upper case then.  Of
+     course, this is only necessary if the upper case letter is
+     actually different.  */
+
+  upper = TOUPPER(name[0]);
+  if (upper != name[0])
+    {
+      char u_name[GFC_MAX_SYMBOL_LEN + 1];
+      gfc_symtree *st;
+      int nlen;
+
+      nlen = strlen(name);
+      gcc_assert (nlen <= GFC_MAX_SYMBOL_LEN);
+      strncpy (u_name, name, nlen + 1);
+      u_name[0] = upper;
+
+      st = gfc_find_symtree (gfc_current_ns->sym_root, u_name);
+
+      if (st != 0)
+       {
+         gfc_error ("Symbol %qs at %C also declared as a type at %L", name,
+                    &st->n.sym->declared_at);
+         return false;
+       }
+    }
+
   /* Start updating the symbol table.  Add basic type attribute if present.  */
   if (current_ts.type != BT_UNKNOWN
       && (sym->attr.implicit_type == 0
index f7fd0bed8f4176ab0623e38da54fc11bfd9f51bd..9dfdc7694b202aa0ad72fea2f956cad767cbd8d9 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-14  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/60526
+       * gfortran.dg/type_decl_4.f90:  Reinstated.
+
 2016-02-14  John David Anglin  <danglin@gcc.gnu.org>
 
        PR fortran/68746
diff --git a/gcc/testsuite/gfortran.dg/type_decl_4.f90 b/gcc/testsuite/gfortran.dg/type_decl_4.f90
new file mode 100644 (file)
index 0000000..5c3ddb8
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+program main
+  type Xx ! { dg-error "Symbol 'xx' at .1. also declared as a type at .2." }
+  end type Xx
+  real :: Xx  ! { dg-error "Symbol 'xx' at .1. also declared as a type at .2." }
+  
+end program main