xref: /llvm-project/clang/test/Modules/string-literal-uniqueness.cpp (revision d8a281590311010955c323806fb24fa484376f4d)
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