19c04851cSChuanqi Xu // RUN: rm -rf %t 29c04851cSChuanqi Xu // RUN: mkdir -p %t 39c04851cSChuanqi Xu // RUN: split-file %s %t 49c04851cSChuanqi Xu // 59c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 %t/foo.cppm -emit-module-interface -o %t/foo.pcm 69c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only -verify 7*da00c60dSChuanqi Xu 8*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 %t/foo.cppm -emit-reduced-module-interface -o %t/foo.pcm 9*da00c60dSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only -verify 109c04851cSChuanqi Xu // 119c04851cSChuanqi Xu //--- bar.h 129c04851cSChuanqi Xu struct bar_base { 139c04851cSChuanqi Xu enum A { 149c04851cSChuanqi Xu a, 159c04851cSChuanqi Xu b, 169c04851cSChuanqi Xu c, 179c04851cSChuanqi Xu d 189c04851cSChuanqi Xu }; 199c04851cSChuanqi Xu constexpr static bool value = false; getbar_base209c04851cSChuanqi Xu static bool get() { return false; } 219c04851cSChuanqi Xu bool member_value = false; get_funcbar_base229c04851cSChuanqi Xu bool get_func() { return false; } 239c04851cSChuanqi Xu }; 249c04851cSChuanqi Xu 259c04851cSChuanqi Xu template <typename T> 269c04851cSChuanqi Xu struct bar : public bar_base { 279c04851cSChuanqi Xu }; 289c04851cSChuanqi Xu 299c04851cSChuanqi Xu //--- foo.cppm 309c04851cSChuanqi Xu module; 319c04851cSChuanqi Xu #include "bar.h" 329c04851cSChuanqi Xu export module foo; 339c04851cSChuanqi Xu export template <typename T> foo()349c04851cSChuanqi Xuint foo() { 359c04851cSChuanqi Xu bool a = bar<T>::value; 369c04851cSChuanqi Xu bar<T>::get(); 379c04851cSChuanqi Xu bar<T> b; 389c04851cSChuanqi Xu b.member_value = a; 399c04851cSChuanqi Xu bool c = b.get_func(); 409c04851cSChuanqi Xu return bar<T>::a; 419c04851cSChuanqi Xu } 429c04851cSChuanqi Xu 439c04851cSChuanqi Xu //--- Use.cpp 449c04851cSChuanqi Xu // expected-no-diagnostics 459c04851cSChuanqi Xu import foo; test()469c04851cSChuanqi Xuvoid test() { 479c04851cSChuanqi Xu foo<int>(); 489c04851cSChuanqi Xu } 49