Bug 111880 - [11/12/13/14] False positive warning of obsolescent COMMON block with Fortran submodule
Summary: [11/12/13/14] False positive warning of obsolescent COMMON block with Fortran...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 13.2.1
: P5 enhancement
Target Milestone: 11.5
Assignee: anlauf
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2023-10-19 15:11 UTC by zed.three
Modified: 2023-12-01 18:05 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2023-11-23 00:00:00


Attachments
Minimal source code demonstrating issue. (201 bytes, text/plain)
2023-10-19 15:11 UTC, zed.three
Details

Note You need to log in before you can comment on or make changes to this bug.
Description zed.three 2023-10-19 15:11:37 UTC
Created attachment 56152 [details]
Minimal source code demonstrating issue.

Compiler Explorer link with complete reproducer: https://godbolt.org/z/dd45enhWe

  module third_party_module
    integer :: some_param
    common /not_my_code/ some_param
  end module third_party_module
  
  module foo
    use third_party_module
    interface
      module subroutine bar()
      end subroutine bar
    end interface
  end module foo
  
  submodule (foo) foo_submod
  contains
    module procedure bar
    end procedure bar
  end submodule foo_submod


Compiling the above minimal program like:

  gfortran -std=f2018 -c foo.f90


gives the following warnings:

  foo.f90:3:22:
  
      3 |   common /not_my_code/ some_param
        |                      1
  Warning: Fortran 2018 obsolescent feature: COMMON block at (1)
  foo.f90:14:14:
  
     14 | submodule (foo) foo_submod
        |              1
  Warning: Fortran 2018 obsolescent feature: COMMON block at (1)


The first warning is expected, but the second one is a false positive. I came across this when building with a library outside of my control, so I cannot remove the problem common block (actually this was with MPI, and it happens with all the major implementations as the common block is required for technical reasons).


If the submodule is removed, the extra warning disappears. The warning also appears when building the submodule separately (in a different file and having already built the parent module).

It also only appears to be this warning, and not other F2018 obsolescent feature warnings (e.g. labeled DO statements), or other warnings enabled at `-Wall` for instance.
Comment 1 kargls 2023-10-19 16:06:58 UTC
(In reply to zed.three from comment #0)
>  Warning: Fortran 2018 obsolescent feature: COMMON block at (1)
>   foo.f90:14:14:
>   
>      14 | submodule (foo) foo_submod
>         |              1
>   Warning: Fortran 2018 obsolescent feature: COMMON block at (1)
> 

Not sure I would call this a false positive as the 
locus is pointing at module 'foo', and 'foo' contains
a common block.
Comment 2 zed.three 2023-10-19 17:20:46 UTC
The common block is in 'third_party_module', rather than 'foo', unless you mean that it is visible from 'foo'? It is still a surprising warning in this location at any rate!
Comment 3 Steve Kargl 2023-10-19 17:32:19 UTC
On Thu, Oct 19, 2023 at 05:20:46PM +0000, zed.three at gmail dot com wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111880
> 
> --- Comment #2 from zed.three at gmail dot com ---
> The common block is in 'third_party_module', rather than 'foo',
> unless you mean that it is visible from 'foo'?

Exactly. 'not_my_code' is in the namespace for foo
through use association of third_party_module. 
It seems that trying to hide 'not_my_code' with PRIVATE
or 'use third_party_module, only : some_param' in foo 
does not mute the warning.  Likely, due to -std=f2018
and F2018, Sec. 4.2.
Comment 4 anlauf 2023-11-23 21:20:18 UTC
Potential fix:

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 81a14653a04..962274f5d25 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -986,8 +986,8 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common)
 
       /* gfc_add_in_common may have been called before, but the reported errors
 	 have been ignored to continue parsing.
-	 We do the checks again here.  */
-      if (!csym->attr.use_assoc)
+	 We do the checks again here, unless the symbol is USE associated.  */
+      if (!csym->attr.use_assoc && !csym->attr.used_in_submodule)
 	{
 	  gfc_add_in_common (&csym->attr, csym->name, &common_block->where);
 	  gfc_notify_std (GFC_STD_F2018_OBS, "COMMON block at %L",
Comment 5 anlauf 2023-11-23 21:42:06 UTC
(In reply to anlauf from comment #4)
> Potential fix:

Regtests ok.
Comment 7 GCC Commits 2023-11-26 19:20:01 UTC
The master branch has been updated by Harald Anlauf <anlauf@gcc.gnu.org>:

https://gcc.gnu.org/g:c9d029ba2ceb435e31492c1f3f0fd3edf0e386be

commit r14-5859-gc9d029ba2ceb435e31492c1f3f0fd3edf0e386be
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Thu Nov 23 22:48:38 2023 +0100

    Fortran: avoid obsolescence warning for COMMON with submodule [PR111880]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/111880
            * resolve.cc (resolve_common_vars): Do not call gfc_add_in_common
            for symbols that are USE associated or used in a submodule.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/111880
            * gfortran.dg/pr111880.f90: New test.
Comment 8 GCC Commits 2023-11-30 21:21:49 UTC
The releases/gcc-13 branch has been updated by Harald Anlauf <anlauf@gcc.gnu.org>:

https://gcc.gnu.org/g:ff96ddf43bcfe5c37a85118a68dcac87ce33c8d9

commit r13-8111-gff96ddf43bcfe5c37a85118a68dcac87ce33c8d9
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Thu Nov 23 22:48:38 2023 +0100

    Fortran: avoid obsolescence warning for COMMON with submodule [PR111880]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/111880
            * resolve.cc (resolve_common_vars): Do not call gfc_add_in_common
            for symbols that are USE associated or used in a submodule.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/111880
            * gfortran.dg/pr111880.f90: New test.
    
    (cherry picked from commit c9d029ba2ceb435e31492c1f3f0fd3edf0e386be)
Comment 9 GCC Commits 2023-12-01 18:00:17 UTC
The releases/gcc-12 branch has been updated by Harald Anlauf <anlauf@gcc.gnu.org>:

https://gcc.gnu.org/g:17cbec6e8ea8817b6240837bb1f1bf74f1b9bdcd

commit r12-10022-g17cbec6e8ea8817b6240837bb1f1bf74f1b9bdcd
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Thu Nov 23 22:48:38 2023 +0100

    Fortran: avoid obsolescence warning for COMMON with submodule [PR111880]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/111880
            * resolve.cc (resolve_common_vars): Do not call gfc_add_in_common
            for symbols that are USE associated or used in a submodule.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/111880
            * gfortran.dg/pr111880.f90: New test.
    
    (cherry picked from commit c9d029ba2ceb435e31492c1f3f0fd3edf0e386be)
Comment 10 GCC Commits 2023-12-01 18:04:06 UTC
The releases/gcc-11 branch has been updated by Harald Anlauf <anlauf@gcc.gnu.org>:

https://gcc.gnu.org/g:246760b37f1239b3b97c20fb4a914f21154389a3

commit r11-11119-g246760b37f1239b3b97c20fb4a914f21154389a3
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Thu Nov 23 22:48:38 2023 +0100

    Fortran: avoid obsolescence warning for COMMON with submodule [PR111880]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/111880
            * resolve.c (resolve_common_vars): Do not call gfc_add_in_common
            for symbols that are USE associated or used in a submodule.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/111880
            * gfortran.dg/pr111880.f90: New test.
    
    (cherry picked from commit c9d029ba2ceb435e31492c1f3f0fd3edf0e386be)
Comment 11 anlauf 2023-12-01 18:05:20 UTC
Fixed on all open branches.  Closing.