(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
c11-uni-string-1.c
       1  /* Test Unicode strings in C11.  Test valid code.  */
       2  /* { dg-do run } */
       3  /* { dg-options "-std=c11 -pedantic-errors" } */
       4  
       5  /* More thorough tests are in c-c++-common/raw-string-*.c; this test
       6     verifies the particular subset (Unicode but not raw strings) that
       7     is in C11.  */
       8  
       9  typedef __CHAR16_TYPE__ char16_t;
      10  typedef __CHAR32_TYPE__ char32_t;
      11  typedef __SIZE_TYPE__ size_t;
      12  
      13  extern void abort (void);
      14  extern void exit (int);
      15  extern int memcmp (const void *, const void *, size_t);
      16  
      17  #define R "(R)"
      18  #define u8R "(u8R)"
      19  #define uR "(uR)"
      20  #define UR "(UR)"
      21  #define LR "(LR)"
      22  #define u8 randomu8
      23  #define u randomu
      24  #define U randomU
      25  
      26  const char su8[] = u8"a\u010d";
      27  const char su8a[] = "a\xc4\x8d";
      28  
      29  const char16_t su16[] = u"\u0567";
      30  const char16_t su16a[] = { 0x0567, 0 };
      31  
      32  const char32_t su32[] = U"\u0123";
      33  const char32_t su32a[] = { 0x0123, 0 };
      34  
      35  const char tu[] = R"a";
      36  const char tua[] = "(R)a";
      37  
      38  const char tu8[] = u8R"b";
      39  const char tu8a[] = "(u8R)b";
      40  
      41  const char tu16[] = uR"c";
      42  const char tu16a[] = "(uR)c";
      43  
      44  const char tu32[] = UR"d";
      45  const char tu32a[] = "(UR)d";
      46  
      47  const char tl[] = LR"e";
      48  const char tla[] = "(LR)e";
      49  
      50  #define str(x) #x
      51  const char ts[] = str(u"a" U"b" u8"c");
      52  const char tsa[] = "u\"a\" U\"b\" u8\"c\"";
      53  
      54  /* GCC always uses UTF-16 and UTF-32 for char16_t and char32_t.  */
      55  #ifndef __STDC_UTF_16__
      56  #error "__STDC_UTF_16__ not defined"
      57  #endif
      58  #ifndef __STDC_UTF_32__
      59  #error "__STDC_UTF_32__ not defined"
      60  #endif
      61  #define xstr(x) str(x)
      62  const char tm16[] = xstr(__STDC_UTF_16__);
      63  const char tm16a[] = "1";
      64  const char tm32[] = xstr(__STDC_UTF_32__);
      65  const char tm32a[] = "1";
      66  
      67  int
      68  main (void)
      69  {
      70    if (sizeof (su8) != sizeof (su8a)
      71        || memcmp (su8, su8a, sizeof (su8)) != 0)
      72      abort ();
      73    if (sizeof (su16) != sizeof (su16a)
      74        || memcmp (su16, su16a, sizeof (su16)) != 0)
      75      abort ();
      76    if (sizeof (su32) != sizeof (su32a)
      77        || memcmp (su32, su32a, sizeof (su32)) != 0)
      78      abort ();
      79    if (sizeof (tu) != sizeof (tua)
      80        || memcmp (tu, tua, sizeof (tu)) != 0)
      81      abort ();
      82    if (sizeof (tu8) != sizeof (tu8a)
      83        || memcmp (tu8, tu8a, sizeof (tu8)) != 0)
      84      abort ();
      85    if (sizeof (tu16) != sizeof (tu16a)
      86        || memcmp (tu16, tu16a, sizeof (tu16)) != 0)
      87      abort ();
      88    if (sizeof (tu32) != sizeof (tu32a)
      89        || memcmp (tu32, tu32a, sizeof (tu32)) != 0)
      90      abort ();
      91    if (sizeof (tl) != sizeof (tla)
      92        || memcmp (tl, tla, sizeof (tl)) != 0)
      93      abort ();
      94    if (sizeof (ts) != sizeof (tsa)
      95        || memcmp (ts, tsa, sizeof (ts)) != 0)
      96      abort ();
      97    if (sizeof (tm16) != sizeof (tm16a)
      98        || memcmp (tm16, tm16a, sizeof (tm16)) != 0)
      99      abort ();
     100    if (sizeof (tm32) != sizeof (tm32a)
     101        || memcmp (tm32, tm32a, sizeof (tm32)) != 0)
     102      abort ();
     103    if (u'\u0123' != 0x0123)
     104      abort ();
     105    if (U'\u0456' != 0x0456)
     106      abort ();
     107  #undef u8
     108  #define u8
     109    if (u8'a' != 'a')
     110      abort ();
     111    exit (0);
     112  }