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 Xuint 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 Xuvoid test() { 44*9c04851cSChuanqi Xu foo<int>(); 45*9c04851cSChuanqi Xu } 46