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