C++20 modules: exporting classes with virtual destructors
Oleg Smolsky
osmolsky@netskope.com
Tue Nov 30 16:16:55 GMT 2021
FWIIW, this case does compile with Clang12:
/opt/llvm-12/bin/clang++ task.cpp -std=c++20 -c -o task.pcm -Xclang
-emit-module-interface
/opt/llvm-12/bin/clang++ task.cpp -std=c++20 -c -o task.o
-fprebuilt-module-path=.
/opt/llvm-12/bin/clang++ main.cpp -std=c++20 -c -o main.o
-fprebuilt-module-path=.
On Mon, Nov 29, 2021 at 4:08 PM Oleg Smolsky <osmolsky@netskope.com> wrote:
> Hi there! I'm trying to integrate C++20 modules into my project and got
> stuck on a "virtual destructor" issue. Here is a minimal reproducer
> rejected by GCC11:
>
> /opt/gcc-11/bin/g++ -std=c++20 -fmodules-ts -c -o main.o main.cpp
> main.cpp: In function ‘int main()’:
> main.cpp:6:12: error: invalid use of non-static member function ‘virtual
> Derived@task::~Derived()’
> 6 | delete p;
>
> The module is called "task" and here is its interface (task.cpp):
>
> export module task;
> #include "b.h"
> #include "d.h"
>
> b.h:
>
> #pragma once
> export struct Base {
> virtual ~Base() = default;
> void DoStuff();
> };
>
> b.cpp:
>
> module;
> #include <string>
> module task;
> void Base::DoStuff() {}
>
> The consumer is exactly what you'd imagine - "new Derived;", followed by a
> virtual call, followed by the "delete".
>
> How is this supposed to work? Is this code Standard-compliant?
>
> Thanks!
> Oleg.
>
More information about the Gcc-help
mailing list