1*c5e4afe6SChuanqi Xu// RUN: rm -rf %t 2*c5e4afe6SChuanqi Xu// RUN: mkdir -p %t 3*c5e4afe6SChuanqi Xu// RUN: split-file %s %t 4*c5e4afe6SChuanqi Xu// 5*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm 6*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify 7*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a-part.cppm -fmodule-file=a=%t/a.pcm -fsyntax-only -verify 8*c5e4afe6SChuanqi Xu// 9*c5e4afe6SChuanqi Xu// Test again with reduced BMI 10*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm 11*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify 12*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a-part.cppm -fmodule-file=a=%t/a.pcm -fsyntax-only -verify 13*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify 14*c5e4afe6SChuanqi Xu 15*c5e4afe6SChuanqi Xu 16*c5e4afe6SChuanqi Xu//--- a.cppm 17*c5e4afe6SChuanqi Xuexport module a; 18*c5e4afe6SChuanqi Xu 19*c5e4afe6SChuanqi Xuconstexpr int x = 43; 20*c5e4afe6SChuanqi Xu 21*c5e4afe6SChuanqi Xuexport constexpr int f() { return x; } 22*c5e4afe6SChuanqi Xu 23*c5e4afe6SChuanqi Xuexport template <typename T> 24*c5e4afe6SChuanqi Xuconstexpr T g() { 25*c5e4afe6SChuanqi Xu return x; 26*c5e4afe6SChuanqi Xu} 27*c5e4afe6SChuanqi Xu 28*c5e4afe6SChuanqi Xunamespace nn { 29*c5e4afe6SChuanqi Xu 30*c5e4afe6SChuanqi Xuconstexpr int x = 88; 31*c5e4afe6SChuanqi Xu 32*c5e4afe6SChuanqi Xuexport constexpr int f() { return x; } 33*c5e4afe6SChuanqi Xu 34*c5e4afe6SChuanqi Xuexport template <typename T> 35*c5e4afe6SChuanqi Xuconstexpr T g() { 36*c5e4afe6SChuanqi Xu return x; 37*c5e4afe6SChuanqi Xu} 38*c5e4afe6SChuanqi Xu} 39*c5e4afe6SChuanqi Xu 40*c5e4afe6SChuanqi Xu//--- use.cc 41*c5e4afe6SChuanqi Xu// expected-no-diagnostics 42*c5e4afe6SChuanqi Xuimport a; 43*c5e4afe6SChuanqi Xu 44*c5e4afe6SChuanqi Xustatic_assert(f() == 43, ""); 45*c5e4afe6SChuanqi Xu 46*c5e4afe6SChuanqi Xuconstexpr int x = 99; 47*c5e4afe6SChuanqi Xu 48*c5e4afe6SChuanqi Xustatic_assert(g<int>() == 43, ""); 49*c5e4afe6SChuanqi Xu 50*c5e4afe6SChuanqi Xustatic_assert(x == 99, ""); 51*c5e4afe6SChuanqi Xu 52*c5e4afe6SChuanqi Xunamespace nn { 53*c5e4afe6SChuanqi Xustatic_assert(f() == 88, ""); 54*c5e4afe6SChuanqi Xu 55*c5e4afe6SChuanqi Xuconstexpr int x = 1000; 56*c5e4afe6SChuanqi Xu 57*c5e4afe6SChuanqi Xustatic_assert(g<int>() == 88, ""); 58*c5e4afe6SChuanqi Xu 59*c5e4afe6SChuanqi Xustatic_assert(x == 1000, ""); 60*c5e4afe6SChuanqi Xu 61*c5e4afe6SChuanqi Xu} 62*c5e4afe6SChuanqi Xu 63*c5e4afe6SChuanqi Xu//--- a-part.cppm 64*c5e4afe6SChuanqi Xumodule a:impl; 65*c5e4afe6SChuanqi Xuimport a; 66*c5e4afe6SChuanqi Xu 67*c5e4afe6SChuanqi Xustatic_assert(x == 43, ""); 68*c5e4afe6SChuanqi Xu 69*c5e4afe6SChuanqi Xuconstexpr int x = 1000; // expected-error {{redefinition of 'x'}} 70*c5e4afe6SChuanqi Xu // expected-note@* {{previous definition is here}} 71*c5e4afe6SChuanqi Xu 72*c5e4afe6SChuanqi Xu//--- a.cc 73*c5e4afe6SChuanqi Xumodule a; 74*c5e4afe6SChuanqi Xu 75*c5e4afe6SChuanqi Xustatic_assert(x == 43, ""); 76*c5e4afe6SChuanqi Xu 77*c5e4afe6SChuanqi Xuconstexpr int x = 1000; // expected-error {{redefinition of 'x'}} 78*c5e4afe6SChuanqi Xu // expected-note@* {{previous definition is here}} 79*c5e4afe6SChuanqi Xu 80