1*d8a28159SRichard Smith // RUN: rm -rf %t 2*d8a28159SRichard Smith // RUN: mkdir -p %t 3*d8a28159SRichard Smith // RUN: split-file %s %t 4*d8a28159SRichard Smith 5*d8a28159SRichard Smith // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/a.cpp \ 6*d8a28159SRichard Smith // RUN: -o %t/A.pcm 7*d8a28159SRichard Smith 8*d8a28159SRichard Smith // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/b.cpp \ 9*d8a28159SRichard Smith // RUN: -fmodule-file=A=%t/A.pcm -o %t/B.pcm 10*d8a28159SRichard Smith 11*d8a28159SRichard Smith // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/c.cpp \ 12*d8a28159SRichard Smith // RUN: -fmodule-file=A=%t/A.pcm -o %t/C.pcm 13*d8a28159SRichard Smith 14*d8a28159SRichard Smith // RUN: %clang_cc1 -std=c++20 -verify %t/main.cpp \ 15*d8a28159SRichard Smith // RUN: -fmodule-file=A=%t/A.pcm \ 16*d8a28159SRichard Smith // RUN: -fmodule-file=B=%t/B.pcm \ 17*d8a28159SRichard Smith // RUN: -fmodule-file=C=%t/C.pcm 18*d8a28159SRichard Smith 19*d8a28159SRichard Smith // expected-no-diagnostics 20*d8a28159SRichard Smith 21*d8a28159SRichard Smith //--- a.cpp 22*d8a28159SRichard Smith 23*d8a28159SRichard Smith export module A; 24*d8a28159SRichard Smith export consteval const char *hello() { return "hello"; } 25*d8a28159SRichard Smith export constexpr const char *helloA0 = hello(); 26*d8a28159SRichard Smith export constexpr const char *helloA1 = helloA0; 27*d8a28159SRichard Smith export constexpr const char *helloA2 = hello(); 28*d8a28159SRichard Smith 29*d8a28159SRichard Smith //--- b.cpp 30*d8a28159SRichard Smith 31*d8a28159SRichard Smith export module B; 32*d8a28159SRichard Smith import A; 33*d8a28159SRichard Smith export constexpr const char *helloB1 = helloA0; 34*d8a28159SRichard Smith export constexpr const char *helloB2 = hello(); 35*d8a28159SRichard Smith 36*d8a28159SRichard Smith //--- c.cpp 37*d8a28159SRichard Smith 38*d8a28159SRichard Smith export module C; 39*d8a28159SRichard Smith import A; 40*d8a28159SRichard Smith export constexpr const char *helloC1 = helloA1; 41*d8a28159SRichard Smith export constexpr const char *helloC2 = hello(); 42*d8a28159SRichard Smith 43*d8a28159SRichard Smith //--- main.cpp 44*d8a28159SRichard Smith 45*d8a28159SRichard Smith import A; 46*d8a28159SRichard Smith import B; 47*d8a28159SRichard Smith import C; 48*d8a28159SRichard Smith 49*d8a28159SRichard Smith // These are valid: they refer to the same evaluation of the same constant. 50*d8a28159SRichard Smith static_assert(helloA0 == helloA1); 51*d8a28159SRichard Smith static_assert(helloA0 == helloB1); 52*d8a28159SRichard Smith static_assert(helloA0 == helloC1); 53*d8a28159SRichard Smith 54*d8a28159SRichard Smith // These refer to distinct evaluations, and so may or may not be equal. 55*d8a28159SRichard Smith static_assert(helloA1 == helloA2); // expected-error {{}} expected-note {{unspecified value}} 56*d8a28159SRichard Smith static_assert(helloA1 == helloB2); // expected-error {{}} expected-note {{unspecified value}} 57*d8a28159SRichard Smith static_assert(helloA1 == helloC2); // expected-error {{}} expected-note {{unspecified value}} 58*d8a28159SRichard Smith static_assert(helloA2 == helloB2); // expected-error {{}} expected-note {{unspecified value}} 59*d8a28159SRichard Smith static_assert(helloA2 == helloC2); // expected-error {{}} expected-note {{unspecified value}} 60*d8a28159SRichard Smith static_assert(helloB2 == helloC2); // expected-error {{}} expected-note {{unspecified value}} 61