// This comes from the issue report of MSVC
// (https://developercommunity.visualstudio.com/t/c20-modules-unresolved-external-symbol/10049210).
//
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: split-file %s %t
//
// RUN: %clang_cc1 -std=c++20 %t/base.cppm -emit-module-interface -o %t/package-base.pcm
// RUN: %clang_cc1 -std=c++20 %t/child.cppm -emit-module-interface -o %t/package-child.pcm \
// RUN:     -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 %t/package.cppm -emit-module-interface -o %t/package.pcm \
// RUN:     -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 %t/use.cpp -fsyntax-only -verify -fprebuilt-module-path=%t

// Test again with reduced BMI
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: split-file %s %t
//
// RUN: %clang_cc1 -std=c++20 %t/base.cppm -emit-reduced-module-interface -o %t/package-base.pcm
// RUN: %clang_cc1 -std=c++20 %t/child.cppm -emit-reduced-module-interface -o %t/package-child.pcm \
// RUN:     -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 %t/package.cppm -emit-reduced-module-interface -o %t/package.pcm \
// RUN:     -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 %t/use.cpp -fsyntax-only -verify -fprebuilt-module-path=%t

//--- base.cppm
export module package:base;

export struct child;

export
template<class> struct base
{
	child getChild();
};


//--- child.cppm
export module package:child;

import :base;

export struct child : base<void> {};

template<class T>
child base<T>::getChild() { return {}; }

//--- package.cppm
export module package;

export import :base;
export import :child;

//--- use.cpp
// expected-no-diagnostics
import package;

int use()
{
	base<void>{}.getChild();
	base<int>{}.getChild();
	return 0;
}
