https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98885
Bug ID: 98885
Summary: [modules] forward declaration of classes prevent them
from being exported at the point of actual declaration
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: pilarlatiesa at gmail dot com
Target Milestone: ---
$ /home/pililatiesa/GCC-11/bin/g++ -v
Using built-in specs.
COLLECT_GCC=/home/pililatiesa/GCC-11/bin/g++
COLLECT_LTO_WRAPPER=/home/pililatiesa/GCC-11/bin/../libexec/gcc/x86_64-pc-linux-gnu/11.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-master/configure --prefix=/home/pililatiesa/GCC-11
--enable-languages=c++ --disable-bootstrap
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.0.0 20210129 (experimental) (GCC)
$ cat A.cpp
export module A;
class A; // forward declaration
export class A {}; // actual declaration
$ cat main.cpp
import A;
int main()
{
A a;
return 0;
}
$ /home/pililatiesa/GCC-11/bin/g++ -fmodules-ts A.cpp main.cpp -o foo
main.cpp: In function ‘int main()’:
main.cpp:6:3: error: ‘A’ was not declared in this scope
6 | A a;
| ^
It can be worked around by typing "export" in the forward declaration as well.
Not sure this is a bug, but it that's the specified behaviour, I’d say it’s
very counter-intuitive. For example, this won’t work:
$ cat A.cpp
export module A;
class B;
export
class A
{
void
f(B const &) const;
};
$ cat B.cpp
export module B;
class A;
export
class B
{
void
f(A const &) const;
};
$ cat A-impl.cpp
module A;
import B;
void
A::f(B const &) const {}
$ cat B-impl.cpp
module B;
import A;
void
B::f(A const &) const {}