xref: /llvm-project/clang/test/Preprocessor/embed_constexpr.cpp (revision a5b5208ba627da46310db67af0dcbb0a824fab92)
141c6e437SMariya Podchishchaeva // RUN: %clang_cc1 %s -fsyntax-only --embed-dir=%S/Inputs -verify -Wno-c23-extensions
241c6e437SMariya Podchishchaeva // RUN: %clang_cc1 %s -fsyntax-only --embed-dir=%S/Inputs -verify -fexperimental-new-constant-interpreter -Wno-c23-extensions
3dba2e66eSMariya Podchishchaeva // expected-no-diagnostics
441c6e437SMariya Podchishchaeva 
541c6e437SMariya Podchishchaeva constexpr int value(int a, int b) {
641c6e437SMariya Podchishchaeva   return a + b;
741c6e437SMariya Podchishchaeva }
841c6e437SMariya Podchishchaeva 
941c6e437SMariya Podchishchaeva constexpr int func_call() {
1041c6e437SMariya Podchishchaeva   return value(
1141c6e437SMariya Podchishchaeva #embed <jk.txt>
1241c6e437SMariya Podchishchaeva   );
1341c6e437SMariya Podchishchaeva }
1441c6e437SMariya Podchishchaeva 
1541c6e437SMariya Podchishchaeva constexpr int init_list_expr() {
1641c6e437SMariya Podchishchaeva   int vals[] = {
1741c6e437SMariya Podchishchaeva #embed <jk.txt>
1841c6e437SMariya Podchishchaeva   };
1941c6e437SMariya Podchishchaeva   return value(vals[0], vals[1]);
2041c6e437SMariya Podchishchaeva }
2141c6e437SMariya Podchishchaeva 
2241c6e437SMariya Podchishchaeva template <int N, int M>
2341c6e437SMariya Podchishchaeva struct Hurr {
2441c6e437SMariya Podchishchaeva   static constexpr int V1 = N;
2541c6e437SMariya Podchishchaeva   static constexpr int V2 = M;
2641c6e437SMariya Podchishchaeva };
2741c6e437SMariya Podchishchaeva 
2841c6e437SMariya Podchishchaeva constexpr int template_args() {
2941c6e437SMariya Podchishchaeva   Hurr<
3041c6e437SMariya Podchishchaeva #embed <jk.txt>
3141c6e437SMariya Podchishchaeva   > H;
3241c6e437SMariya Podchishchaeva   return value(H.V1, H.V2);
3341c6e437SMariya Podchishchaeva }
3441c6e437SMariya Podchishchaeva 
3541c6e437SMariya Podchishchaeva constexpr int ExpectedValue = 'j' + 'k';
3641c6e437SMariya Podchishchaeva static_assert(func_call() == ExpectedValue);
3741c6e437SMariya Podchishchaeva static_assert(init_list_expr() == ExpectedValue);
3841c6e437SMariya Podchishchaeva static_assert(template_args() == ExpectedValue);
3941c6e437SMariya Podchishchaeva 
4041c6e437SMariya Podchishchaeva static_assert(
4141c6e437SMariya Podchishchaeva #embed <jk.txt> limit(1) suffix(== 'j')
4241c6e437SMariya Podchishchaeva );
4341c6e437SMariya Podchishchaeva 
4441c6e437SMariya Podchishchaeva int array[
4541c6e437SMariya Podchishchaeva #embed <jk.txt> limit(1)
4641c6e437SMariya Podchishchaeva ];
4741c6e437SMariya Podchishchaeva static_assert(sizeof(array) / sizeof(int) == 'j');
4841c6e437SMariya Podchishchaeva 
4941c6e437SMariya Podchishchaeva constexpr int comma_expr = (
50dba2e66eSMariya Podchishchaeva #embed <jk.txt>
5141c6e437SMariya Podchishchaeva );
5241c6e437SMariya Podchishchaeva static_assert(comma_expr == 'k');
5341c6e437SMariya Podchishchaeva 
5441c6e437SMariya Podchishchaeva constexpr int comma_expr_init_list{ (
5541c6e437SMariya Podchishchaeva #embed <jk.txt> limit(1)
5641c6e437SMariya Podchishchaeva ) };
5741c6e437SMariya Podchishchaeva static_assert(comma_expr_init_list == 'j');
5841c6e437SMariya Podchishchaeva 
5941c6e437SMariya Podchishchaeva constexpr int paren_init(
6041c6e437SMariya Podchishchaeva #embed <jk.txt> limit(1)
6141c6e437SMariya Podchishchaeva );
6241c6e437SMariya Podchishchaeva static_assert(paren_init == 'j');
6341c6e437SMariya Podchishchaeva 
6441c6e437SMariya Podchishchaeva struct S {
6541c6e437SMariya Podchishchaeva   const char buffer[2] = {
6641c6e437SMariya Podchishchaeva #embed "jk.txt"
6741c6e437SMariya Podchishchaeva   };
6841c6e437SMariya Podchishchaeva };
6941c6e437SMariya Podchishchaeva 
7041c6e437SMariya Podchishchaeva constexpr struct S s;
7141c6e437SMariya Podchishchaeva static_assert(s.buffer[1] == 'k');
7241c6e437SMariya Podchishchaeva 
7341c6e437SMariya Podchishchaeva struct S1 {
7441c6e437SMariya Podchishchaeva   int x, y;
7541c6e437SMariya Podchishchaeva };
7641c6e437SMariya Podchishchaeva 
7741c6e437SMariya Podchishchaeva struct T {
7841c6e437SMariya Podchishchaeva   int x, y;
7941c6e437SMariya Podchishchaeva   struct S1 s;
8041c6e437SMariya Podchishchaeva };
8141c6e437SMariya Podchishchaeva 
8241c6e437SMariya Podchishchaeva constexpr struct T t[] = {
8341c6e437SMariya Podchishchaeva #embed <numbers.txt>
8441c6e437SMariya Podchishchaeva };
8541c6e437SMariya Podchishchaeva static_assert(t[0].s.x == '2');
8641c6e437SMariya Podchishchaeva 
8741c6e437SMariya Podchishchaeva constexpr int func(int i, int) { return i; }
8841c6e437SMariya Podchishchaeva static_assert(
8941c6e437SMariya Podchishchaeva   func(
9041c6e437SMariya Podchishchaeva #embed <jk.txt>
9141c6e437SMariya Podchishchaeva   ) == 'j');
9241c6e437SMariya Podchishchaeva 
9341c6e437SMariya Podchishchaeva template <int N>
9441c6e437SMariya Podchishchaeva struct ST {};
9541c6e437SMariya Podchishchaeva 
9641c6e437SMariya Podchishchaeva ST<
9741c6e437SMariya Podchishchaeva #embed <jk.txt> limit(1)
9841c6e437SMariya Podchishchaeva > st;
99*a5b5208bSMariya Podchishchaeva 
100*a5b5208bSMariya Podchishchaeva struct HasCharArray { unsigned char h[10]; };
101*a5b5208bSMariya Podchishchaeva struct Wrapper { int a; struct HasCharArray d;  };
102*a5b5208bSMariya Podchishchaeva constexpr struct Wrapper W = {
103*a5b5208bSMariya Podchishchaeva #embed "numbers.txt"
104*a5b5208bSMariya Podchishchaeva };
105*a5b5208bSMariya Podchishchaeva 
106*a5b5208bSMariya Podchishchaeva static_assert(W.d.h[2] == '3');
107