public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/100617] New: [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace
@ 2021-05-15 19:42 amorvincitomnia.iw at gmail dot com
  2021-05-16  8:53 ` [Bug c++/100617] " amorvincitomnia.iw at gmail dot com
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: amorvincitomnia.iw at gmail dot com @ 2021-05-15 19:42 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100617

            Bug ID: 100617
           Summary: [modules] Exported namespace not visible from outside
                    when the module imports another module that declares
                    the same namespace
           Product: gcc
           Version: 11.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: amorvincitomnia.iw at gmail dot com
  Target Milestone: ---

See it live: https://wandbox.org/permlink/1Tgk83eCk7VYm3a3


Minimum code to reproduce the error:

//test2.cc
export module test2;
export namespace A{}

//test1.cc
export module test1;
import test2;
export namespace A{
    int a = 3;
}

//prog.cc
import test1;

void g(){
    A::a;
}



Compile it with:

$ g++ "-std=c++20" "-fmodules-ts" "test2.cc" "test1.cc" "prog.cc"



Results in error:

prog.cc: In function 'void g()':
prog.cc:5:5: error: 'A' has not been declared
    5 |     A::a;
      |     ^



Reproduces in both g++ 11.1.0 and g++ 12.0.0 20210510.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/100617] [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace
  2021-05-15 19:42 [Bug c++/100617] New: [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace amorvincitomnia.iw at gmail dot com
@ 2021-05-16  8:53 ` amorvincitomnia.iw at gmail dot com
  2022-02-11 12:47 ` asynts+bugs at gmail dot com
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: amorvincitomnia.iw at gmail dot com @ 2021-05-16  8:53 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100617

--- Comment #1 from wang ivor <amorvincitomnia.iw at gmail dot com> ---
A workaround is to create a module that exports only the namespace A and
'export import' it in the module 'test1'.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/100617] [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace
  2021-05-15 19:42 [Bug c++/100617] New: [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace amorvincitomnia.iw at gmail dot com
  2021-05-16  8:53 ` [Bug c++/100617] " amorvincitomnia.iw at gmail dot com
@ 2022-02-11 12:47 ` asynts+bugs at gmail dot com
  2022-02-11 13:02 ` johelegp at gmail dot com
  2024-02-11 14:15 ` nshead at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: asynts+bugs at gmail dot com @ 2022-02-11 12:47 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100617

Paul Scharnofske <asynts+bugs at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |asynts+bugs at gmail dot com

--- Comment #2 from Paul Scharnofske <asynts+bugs at gmail dot com> ---
I ran into the same issue and produced a slightly different example:

```c++
// foo.cpp
export module foo;

import bar;

namespace foo
{
    export void foo() { }
}
```
```c++
// bar.cpp
export module bar;

namespace foo
{

}
```
```c++
// baz.cpp
export module baz;

import foo;
import bar;

int main() {
    foo::foo();
}
```
```none
$ ~/.local/lib/gcc-trunk/bin/g++ --version
g++ (GCC) 12.0.1 20220211 (experimental)
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ~/.local/lib/gcc-trunk/bin/g++ -Wall -Wextra -std=c++20 -fmodules-ts bar.cpp
foo.cpp baz.cpp
baz.cpp: In function 'int main()':
baz.cpp:8:5: error: 'foo' has not been declared
    8 |     foo::foo();
      |     ^~~
baz.cpp: At global scope:
baz.cpp:2:8: warning: not writing module 'baz' due to errors
    2 | export module baz;
      |        ^~~~~~
```
https://godbolt.org/z/8zMaq6eqr

-   In other words, the 'export' specifier doesn't even have to be mentioned.
    It is enough if the same namespace is mentioned even if it is completely
empty and not exported.

-   The issue disappears if the 'import bar' is removed from 'foo.cpp', in
other words, this only happens
    if that module is actually imported.  It doesn't matter that it's still
imported in 'baz.cpp'.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/100617] [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace
  2021-05-15 19:42 [Bug c++/100617] New: [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace amorvincitomnia.iw at gmail dot com
  2021-05-16  8:53 ` [Bug c++/100617] " amorvincitomnia.iw at gmail dot com
  2022-02-11 12:47 ` asynts+bugs at gmail dot com
@ 2022-02-11 13:02 ` johelegp at gmail dot com
  2024-02-11 14:15 ` nshead at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: johelegp at gmail dot com @ 2022-02-11 13:02 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100617

--- Comment #3 from Johel Ernesto Guerrero Peña <johelegp at gmail dot com> ---
(In reply to wang ivor from comment #1)
> A workaround is to create a module that exports only the namespace A and
> 'export import' it in the module 'test1'.

I did that, but it's not enough. See Bug 102524.

I export a `detail` namespace like this to workaround the issue in its parent
namespace:
```C++
export module waarudo.details.workaround_gcc_bug_100617;

export namespace waarudo::detail {

void workaround_gcc_bug_100617() { }

} // namespace waarudo::detail

```

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug c++/100617] [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace
  2021-05-15 19:42 [Bug c++/100617] New: [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace amorvincitomnia.iw at gmail dot com
                   ` (2 preceding siblings ...)
  2022-02-11 13:02 ` johelegp at gmail dot com
@ 2024-02-11 14:15 ` nshead at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: nshead at gcc dot gnu.org @ 2024-02-11 14:15 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100617

Nathaniel Shead <nshead at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=100707
           Assignee|unassigned at gcc dot gnu.org      |nshead at gcc dot gnu.org
   Target Milestone|---                         |14.0
         Resolution|---                         |FIXED
                 CC|                            |nshead at gcc dot gnu.org
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #4 from Nathaniel Shead <nshead at gcc dot gnu.org> ---
Fixed with r14-8407-gb433a6f5a0617d.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-02-11 14:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-15 19:42 [Bug c++/100617] New: [modules] Exported namespace not visible from outside when the module imports another module that declares the same namespace amorvincitomnia.iw at gmail dot com
2021-05-16  8:53 ` [Bug c++/100617] " amorvincitomnia.iw at gmail dot com
2022-02-11 12:47 ` asynts+bugs at gmail dot com
2022-02-11 13:02 ` johelegp at gmail dot com
2024-02-11 14:15 ` nshead at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).