llvm-project/clang/test/Modules/string-literal-uniqueness.cpp
Richard Smith d8a2815903
[clang] implement current direction of CWG2765 for string literal comparisons in constant evaluation (#109208)
Track the identity of each string literal object produced by evaluation
with a global version number. Accept comparisons between literals of the
same version, and between literals of different versions that cannot
possibly be placed in overlapping storage. Treat the remaining
comparisons as non-constant.

---------

Co-authored-by: Timm Baeder <tbaeder@redhat.com>
Co-authored-by: Aaron Ballman <aaron@aaronballman.com>
2024-09-26 15:56:33 -07:00

61 lines
1.9 KiB
C++

// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/a.cpp \
// RUN: -o %t/A.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/b.cpp \
// RUN: -fmodule-file=A=%t/A.pcm -o %t/B.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/c.cpp \
// RUN: -fmodule-file=A=%t/A.pcm -o %t/C.pcm
// RUN: %clang_cc1 -std=c++20 -verify %t/main.cpp \
// RUN: -fmodule-file=A=%t/A.pcm \
// RUN: -fmodule-file=B=%t/B.pcm \
// RUN: -fmodule-file=C=%t/C.pcm
// expected-no-diagnostics
//--- a.cpp
export module A;
export consteval const char *hello() { return "hello"; }
export constexpr const char *helloA0 = hello();
export constexpr const char *helloA1 = helloA0;
export constexpr const char *helloA2 = hello();
//--- b.cpp
export module B;
import A;
export constexpr const char *helloB1 = helloA0;
export constexpr const char *helloB2 = hello();
//--- c.cpp
export module C;
import A;
export constexpr const char *helloC1 = helloA1;
export constexpr const char *helloC2 = hello();
//--- main.cpp
import A;
import B;
import C;
// These are valid: they refer to the same evaluation of the same constant.
static_assert(helloA0 == helloA1);
static_assert(helloA0 == helloB1);
static_assert(helloA0 == helloC1);
// These refer to distinct evaluations, and so may or may not be equal.
static_assert(helloA1 == helloA2); // expected-error {{}} expected-note {{unspecified value}}
static_assert(helloA1 == helloB2); // expected-error {{}} expected-note {{unspecified value}}
static_assert(helloA1 == helloC2); // expected-error {{}} expected-note {{unspecified value}}
static_assert(helloA2 == helloB2); // expected-error {{}} expected-note {{unspecified value}}
static_assert(helloA2 == helloC2); // expected-error {{}} expected-note {{unspecified value}}
static_assert(helloB2 == helloC2); // expected-error {{}} expected-note {{unspecified value}}