diff options
author | Harald Anlauf <anlauf@gmx.de> | 2025-01-30 22:21:19 +0100 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2025-01-31 19:03:19 +0100 |
commit | d6418fe22684f9335474d1fd405ade45954c069d (patch) | |
tree | b6d1d526a31d58d04410886270b2c9eb84cf860f | |
parent | af51fe9593ec0e9373f8a453bab2129a48193a44 (diff) | |
download | gcc-d6418fe22684f9335474d1fd405ade45954c069d.zip gcc-d6418fe22684f9335474d1fd405ade45954c069d.tar.gz gcc-d6418fe22684f9335474d1fd405ade45954c069d.tar.bz2 |
Fortran: host association issue with symbol in COMMON block [PR108454]
When resolving a flavorless symbol that is already registered with a COMMON
block, and which neither has the intrinsic, generic, or external attribute,
skip searching among interfaces to avoid false resolution to a derived type
of the same name.
PR fortran/108454
gcc/fortran/ChangeLog:
* resolve.cc (resolve_common_blocks): Initialize variable.
(resolve_symbol): If a symbol is already registered with a COMMON
block, do not search for an interface with the same name.
gcc/testsuite/ChangeLog:
* gfortran.dg/common_29.f90: New test.
-rw-r--r-- | gcc/fortran/resolve.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/common_29.f90 | 34 |
2 files changed, 42 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 12a623da..f2eef12 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -1049,7 +1049,7 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common) static void resolve_common_blocks (gfc_symtree *common_root) { - gfc_symbol *sym; + gfc_symbol *sym = NULL; gfc_gsymbol * gsym; if (common_root == NULL) @@ -17693,6 +17693,12 @@ resolve_symbol (gfc_symbol *sym) && sym->attr.if_source == IFSRC_UNKNOWN && sym->ts.type == BT_UNKNOWN)) { + /* A symbol in a common block might not have been resolved yet properly. + Do not try to find an interface with the same name. */ + if (sym->attr.flavor == FL_UNKNOWN && !sym->attr.intrinsic + && !sym->attr.generic && !sym->attr.external + && sym->attr.in_common) + goto skip_interfaces; /* If we find that a flavorless symbol is an interface in one of the parent namespaces, find its symtree in this namespace, free the @@ -17716,6 +17722,7 @@ resolve_symbol (gfc_symbol *sym) } } +skip_interfaces: /* Otherwise give it a flavor according to such attributes as it has. */ if (sym->attr.flavor == FL_UNKNOWN && sym->attr.external == 0 diff --git a/gcc/testsuite/gfortran.dg/common_29.f90 b/gcc/testsuite/gfortran.dg/common_29.f90 new file mode 100644 index 0000000..66f2a18 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/common_29.f90 @@ -0,0 +1,34 @@ +! { dg-do compile } +! PR fortran/108454 +! +! Contributed by G.Steinmetz + +module m + type t + end type +contains + subroutine s + common t + end +end + +module m2 + implicit none + type t + end type +contains + subroutine s + real :: t + common /com/ t + end +end + +module m3 + type t + end type +contains + subroutine s + type(t) :: x ! { dg-error "cannot be host associated at .1." } + common t ! { dg-error "incompatible object of the same name" } + end +end |