http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53537

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2012-05-31
                 CC|                            |burnus at gcc dot gnu.org
   Target Milestone|---                         |4.5.4
            Summary|Abstract interface with     |[4.5/4.6/4.7/4.8
                   |import interferes with      |Regression] Explicit IMPORT
                   |only-clause                 |of renamed USE-associated
                   |                            |symbol fails
     Ever Confirmed|0                           |1

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-05-31 
15:11:32 UTC ---
Confirmed. The ingredients are:
- The use associated symbol is renamed
- IMPORT explicitly lists the renamed symbol

The following program compiles with GCC 4.3 and 4.4 but not with
4.5/4.6/4.7/4.8:

Error: Parameter 'wp' at (1) has not been declared or is a variable, which does
not reduce to a constant expression


At the "IMPORT :: wp" line (gfc_match_import), the "wp" is found and gets
imported as st->name == "dp", st->n.sym->name == "dp". In check_init_expr,
e->symtree->n.sym is a FL_VARIABLE with name "wp".



module select_precision
    integer, parameter :: dp = kind(1.0)
end module select_precision

module ode_types
    use select_precision, only: wp => dp
    implicit none
    interface
        subroutine ode_derivative(x)
            import   :: wp
            real(wp) :: x
        end subroutine ode_derivative
    end interface
end module ode_types


Draft patch (lightly tested):

--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -3188 +3188 @@ gfc_match_import (void)
-         if (gfc_find_symtree (gfc_current_ns->sym_root,name))
+         if (gfc_find_symtree (gfc_current_ns->sym_root, name))
@@ -3195 +3195 @@ gfc_match_import (void)
-         st = gfc_new_symtree (&gfc_current_ns->sym_root, sym->name);
+         st = gfc_new_symtree (&gfc_current_ns->sym_root, name);

Reply via email to