1*9c04851cSChuanqi Xu // RUN: rm -rf %t
2*9c04851cSChuanqi Xu // RUN: mkdir -p %t
3*9c04851cSChuanqi Xu // RUN: split-file %s %t
4*9c04851cSChuanqi Xu //
5*9c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 %t/foo.cppm -emit-module-interface -o %t/foo.pcm
6*9c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only -verify
7*9c04851cSChuanqi Xu //
8*9c04851cSChuanqi Xu //--- bar.h
9*9c04851cSChuanqi Xu struct bar_base {
10*9c04851cSChuanqi Xu   enum A {
11*9c04851cSChuanqi Xu     a,
12*9c04851cSChuanqi Xu     b,
13*9c04851cSChuanqi Xu     c,
14*9c04851cSChuanqi Xu     d
15*9c04851cSChuanqi Xu   };
16*9c04851cSChuanqi Xu   constexpr static bool value = false;
getbar_base17*9c04851cSChuanqi Xu   static bool get() { return false; }
18*9c04851cSChuanqi Xu   bool member_value = false;
get_funcbar_base19*9c04851cSChuanqi Xu   bool get_func() { return false; }
20*9c04851cSChuanqi Xu };
21*9c04851cSChuanqi Xu 
22*9c04851cSChuanqi Xu template <typename T>
23*9c04851cSChuanqi Xu struct bar : public bar_base {
24*9c04851cSChuanqi Xu };
25*9c04851cSChuanqi Xu 
26*9c04851cSChuanqi Xu //--- foo.cppm
27*9c04851cSChuanqi Xu module;
28*9c04851cSChuanqi Xu #include "bar.h"
29*9c04851cSChuanqi Xu export module foo;
30*9c04851cSChuanqi Xu export template <typename T>
foo()31*9c04851cSChuanqi Xu int foo() {
32*9c04851cSChuanqi Xu   bool a = bar<T>::value;
33*9c04851cSChuanqi Xu   bar<T>::get();
34*9c04851cSChuanqi Xu   bar<T> b;
35*9c04851cSChuanqi Xu   b.member_value = a;
36*9c04851cSChuanqi Xu   bool c = b.get_func();
37*9c04851cSChuanqi Xu   return bar<T>::a;
38*9c04851cSChuanqi Xu }
39*9c04851cSChuanqi Xu 
40*9c04851cSChuanqi Xu //--- Use.cpp
41*9c04851cSChuanqi Xu // expected-no-diagnostics
42*9c04851cSChuanqi Xu import foo;
test()43*9c04851cSChuanqi Xu void test() {
44*9c04851cSChuanqi Xu   foo<int>();
45*9c04851cSChuanqi Xu }
46