1 // RUN: rm -rf %t 2 // RUN: mkdir %t 3 // RUN: split-file %s %t 4 // 5 // RUN: %clang_cc1 -x c++ -std=c++20 -fmodules -fmodule-name=foo %t/foo.map -emit-module -o %t/foo.pcm 6 // RUN: %clang_cc1 -x c++ -std=c++20 -fmodules -fmodules-cache-path=%t \ 7 // RUN: -fmodule-file=%t/foo.pcm %t/use.cpp -verify -fsyntax-only 8 9 //--- foo.map 10 module "foo" { 11 export * 12 header "foo.h" 13 } 14 15 //--- foo.h 16 template<class T1, int V = 0> 17 class A; 18 19 template <typename T> 20 class templ_params {}; 21 22 template<class T1, template <typename> typename T2 = templ_params> 23 class B; 24 25 template<class T1, class T2 = int> 26 class C; 27 28 //--- use.cpp 29 #include "foo.h" 30 template<class T1, int V = 1> // expected-error {{template parameter default argument is inconsistent with previous definition}} 31 class A; // expected-note@foo.h:1 {{previous default template argument defined in module foo}} 32 33 template <typename T> 34 class templ_params2 {}; 35 36 template<class T1, template <typename> typename T2 = templ_params2> // expected-error {{template parameter default argument is inconsistent with previous definition}} 37 class B; // expected-note@foo.h:7 {{previous default template argument defined in module foo}} 38 39 template<class T1, class T2 = double> // expected-error {{template parameter default argument is inconsistent with previous definition}} 40 class C; // expected-note@foo.h:10 {{previous default template argument defined in module foo}} 41