Skip to content

abuehl/internal-partition-test

Repository files navigation

This small C++ 20 project using C++ modules demonstrates a compiler error present in:

Microsoft (R) C/C++ Optimizing Compiler Version 19.43.34810 for x64

The program fails to compile with the following compiler errors:

A.cpp(11,9): error C2079: 'f' uses undefined class 'A::Fox'
A.cpp(12,5): error C2664: 'void A::print_age(A::Fox &)': cannot convert argument 1 from 'int' to 'A::Fox &'

The program has a main() function in internal-partition-test.cpp. There, a module A is imported. Function A::Test() is called, which is defined in A.cpp as

module A;

import :Fox;
import :PrintFox;

namespace A
{

void Test()
{
    Fox f;
    print_age(f);
}

}

:Fox and :PrintFox are internal partitions of module A.

Fox.cpp defines class Fox:

module A:Fox;

namespace A
{

class Fox
{
public:
    int age{ 0 };
};

}

PrintFox.cpp is an internal partition which declares function print_age(Fox&):

module A:PrintFox;

// uncomment one of the two imports below

// if we import :Fox, the program compiles fine
//import :Fox;

// if we instead import :Fox_forward, it fails to compile!
import :Fox_forward;

// errors:
// A.cpp(11,9): error C2079: 'f' uses undefined class 'A::Fox'
// A.cpp(12,5): error C2664: 'void A::print_age(A::Fox &)': cannot convert argument 1 from 'int' to 'A::Fox &'


namespace A
{

void print_age(Fox&);

}

Fox_forward.cpp is an internal partition, which only forward declares class Fox:

module A:Fox_forward;

namespace A
{

class Fox;

}

The program should compile fine, if :Fox_forward is imported in PrintFox.cpp.

The compiler fails to accept a forward declaration in one internal partion of a class defined in a different internal partition of the same module.

The project was created with Microsoft Visual Studio Community 2022 (64-bit) Version 17.13.6. Open the file internal-partition-test.sln.

About

Cannot forward declare class in internal module partition (C++20)

Resources

Stars

Watchers

Forks

Languages