aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2011-08-18 16:13:49 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2011-08-18 16:13:49 +0100
commita48e3dd10e2e898742f2a730b8307b73b1a23022 (patch)
tree08a78c5cfab58cc36bb826b78a1902d8f7e41149
parent3b6fa7a5c6e84489d6be9012163c9923cbb9a95c (diff)
downloadgcc-a48e3dd10e2e898742f2a730b8307b73b1a23022.zip
gcc-a48e3dd10e2e898742f2a730b8307b73b1a23022.tar.gz
gcc-a48e3dd10e2e898742f2a730b8307b73b1a23022.tar.bz2
c1x-uni-string-1.c, [...]: New tests.
gcc/testsuite: * gcc.dg/c1x-uni-string-1.c, gcc.dg/c1x-uni-string-2.c: New tests. libcpp: * include/cpplib.h (struct cpp_options): Add rliterals. * init.c (struct lang_flags, lang_defaults): Add rliterals. (cpp_set_lang): Set rliterals option. (cpp_init_builtins): Define __STDC_UTF_16__ and __STDC_UTF_32__. * lex.c (_cpp_lex_direct): Only accept raw strings if rliterals. From-SVN: r177868
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/c1x-uni-string-1.c112
-rw-r--r--gcc/testsuite/gcc.dg/c1x-uni-string-2.c8
-rw-r--r--libcpp/ChangeLog8
-rw-r--r--libcpp/include/cpplib.h6
-rw-r--r--libcpp/init.c37
-rw-r--r--libcpp/lex.c12
7 files changed, 167 insertions, 20 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f76a52c..d8f7f11 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-08-18 Joseph Myers <joseph@codesourcery.com>
+
+ * gcc.dg/c1x-uni-string-1.c, gcc.dg/c1x-uni-string-2.c: New tests.
+
2011-08-18 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
diff --git a/gcc/testsuite/gcc.dg/c1x-uni-string-1.c b/gcc/testsuite/gcc.dg/c1x-uni-string-1.c
new file mode 100644
index 0000000..30a98c1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c1x-uni-string-1.c
@@ -0,0 +1,112 @@
+/* Test Unicode strings in C1X. Test valid code. */
+/* { dg-do run } */
+/* { dg-options "-std=c1x -pedantic-errors" } */
+
+/* More thorough tests are in c-c++-common/raw-string-*.c; this test
+ verifies the particular subset (Unicode but not raw strings) that
+ is in C1X. */
+
+typedef __CHAR16_TYPE__ char16_t;
+typedef __CHAR32_TYPE__ char32_t;
+typedef __SIZE_TYPE__ size_t;
+
+extern void abort (void);
+extern void exit (int);
+extern int memcmp (const void *, const void *, size_t);
+
+#define R "(R)"
+#define u8R "(u8R)"
+#define uR "(uR)"
+#define UR "(UR)"
+#define LR "(LR)"
+#define u8 randomu8
+#define u randomu
+#define U randomU
+
+const char su8[] = u8"a\u010d";
+const char su8a[] = "a\xc4\x8d";
+
+const char16_t su16[] = u"\u0567";
+const char16_t su16a[] = { 0x0567, 0 };
+
+const char32_t su32[] = U"\u0123";
+const char32_t su32a[] = { 0x0123, 0 };
+
+const char tu[] = R"a";
+const char tua[] = "(R)a";
+
+const char tu8[] = u8R"b";
+const char tu8a[] = "(u8R)b";
+
+const char tu16[] = uR"c";
+const char tu16a[] = "(uR)c";
+
+const char tu32[] = UR"d";
+const char tu32a[] = "(UR)d";
+
+const char tl[] = LR"e";
+const char tla[] = "(LR)e";
+
+#define str(x) #x
+const char ts[] = str(u"a" U"b" u8"c");
+const char tsa[] = "u\"a\" U\"b\" u8\"c\"";
+
+/* GCC always uses UTF-16 and UTF-32 for char16_t and char32_t. */
+#ifndef __STDC_UTF_16__
+#error "__STDC_UTF_16__ not defined"
+#endif
+#ifndef __STDC_UTF_32__
+#error "__STDC_UTF_32__ not defined"
+#endif
+#define xstr(x) str(x)
+const char tm16[] = xstr(__STDC_UTF_16__);
+const char tm16a[] = "1";
+const char tm32[] = xstr(__STDC_UTF_32__);
+const char tm32a[] = "1";
+
+int
+main (void)
+{
+ if (sizeof (su8) != sizeof (su8a)
+ || memcmp (su8, su8a, sizeof (su8)) != 0)
+ abort ();
+ if (sizeof (su16) != sizeof (su16a)
+ || memcmp (su16, su16a, sizeof (su16)) != 0)
+ abort ();
+ if (sizeof (su32) != sizeof (su32a)
+ || memcmp (su32, su32a, sizeof (su32)) != 0)
+ abort ();
+ if (sizeof (tu) != sizeof (tua)
+ || memcmp (tu, tua, sizeof (tu)) != 0)
+ abort ();
+ if (sizeof (tu8) != sizeof (tu8a)
+ || memcmp (tu8, tu8a, sizeof (tu8)) != 0)
+ abort ();
+ if (sizeof (tu16) != sizeof (tu16a)
+ || memcmp (tu16, tu16a, sizeof (tu16)) != 0)
+ abort ();
+ if (sizeof (tu32) != sizeof (tu32a)
+ || memcmp (tu32, tu32a, sizeof (tu32)) != 0)
+ abort ();
+ if (sizeof (tl) != sizeof (tla)
+ || memcmp (tl, tla, sizeof (tl)) != 0)
+ abort ();
+ if (sizeof (ts) != sizeof (tsa)
+ || memcmp (ts, tsa, sizeof (ts)) != 0)
+ abort ();
+ if (sizeof (tm16) != sizeof (tm16a)
+ || memcmp (tm16, tm16a, sizeof (tm16)) != 0)
+ abort ();
+ if (sizeof (tm32) != sizeof (tm32a)
+ || memcmp (tm32, tm32a, sizeof (tm32)) != 0)
+ abort ();
+ if (u'\u0123' != 0x0123)
+ abort ();
+ if (U'\u0456' != 0x0456)
+ abort ();
+#undef u8
+#define u8
+ if (u8'a' != 'a')
+ abort ();
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.dg/c1x-uni-string-2.c b/gcc/testsuite/gcc.dg/c1x-uni-string-2.c
new file mode 100644
index 0000000..698b0c1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c1x-uni-string-2.c
@@ -0,0 +1,8 @@
+/* Test Unicode strings in C1X. Test constraint. */
+/* { dg-do compile } */
+/* { dg-options "-std=c1x -pedantic-errors" } */
+
+const void *p1 = L"a" u8"b"; /* { dg-error "concatenation" } */
+const void *p2 = L"a" "b" u8"c"; /* { dg-error "concatenation" } */
+const void *p3 = u8"a" L"b"; /* { dg-error "concatenation" } */
+const void *p4 = u8"a" "b" L"c"; /* { dg-error "concatenation" } */
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index e136852..ad51473 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,11 @@
+2011-08-18 Joseph Myers <joseph@codesourcery.com>
+
+ * include/cpplib.h (struct cpp_options): Add rliterals.
+ * init.c (struct lang_flags, lang_defaults): Add rliterals.
+ (cpp_set_lang): Set rliterals option.
+ (cpp_init_builtins): Define __STDC_UTF_16__ and __STDC_UTF_32__.
+ * lex.c (_cpp_lex_direct): Only accept raw strings if rliterals.
+
2011-08-15 Gabriel Charette <gchare@google.com>
* include/line-map.h (LINEMAP_POSITION_FOR_COLUMN): Remove.
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 55b0f1b..30b1e98 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -1,6 +1,6 @@
/* Definitions for CPP library.
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2007, 2008, 2009, 2010
+ 2004, 2005, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
Written by Per Bothner, 1994-95.
@@ -315,6 +315,10 @@ struct cpp_options
/* Nonzero means process u/U prefix literals (UTF-16/32). */
unsigned char uliterals;
+ /* Nonzero means process r/R rax strings. If this is set, uliterals
+ must be set as well. */
+ unsigned char rliterals;
+
/* Nonzero means print names of header files (-H). */
unsigned char print_include_names;
diff --git a/libcpp/init.c b/libcpp/init.c
index 5ba6666..1cbb9dd 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -1,7 +1,7 @@
/* CPP Library.
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
- 2009, 2010 Free Software Foundation, Inc.
+ 2009, 2010, 2011 Free Software Foundation, Inc.
Contributed by Per Bothner, 1994-95.
Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987
@@ -79,22 +79,23 @@ struct lang_flags
char cplusplus_comments;
char digraphs;
char uliterals;
+ char rliterals;
};
static const struct lang_flags lang_defaults[] =
-{ /* c99 c++ xnum xid std // digr ulit */
- /* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0 },
- /* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1 },
- /* GNUC1X */ { 1, 0, 1, 0, 0, 1, 1, 1 },
- /* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0 },
- /* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0 },
- /* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0 },
- /* STDC1X */ { 1, 0, 1, 0, 1, 1, 1, 0 },
- /* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0 },
- /* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0 },
- /* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1, 1 },
- /* CXX0X */ { 1, 1, 1, 0, 1, 1, 1, 1 },
- /* ASM */ { 0, 0, 1, 0, 0, 1, 0, 0 }
+{ /* c99 c++ xnum xid std // digr ulit rlit */
+ /* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0, 0 },
+ /* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 1 },
+ /* GNUC1X */ { 1, 0, 1, 0, 0, 1, 1, 1, 1 },
+ /* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0, 0 },
+ /* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0, 0 },
+ /* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0, 0 },
+ /* STDC1X */ { 1, 0, 1, 0, 1, 1, 1, 1, 0 },
+ /* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0, 0 },
+ /* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0, 0 },
+ /* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1, 1, 1 },
+ /* CXX0X */ { 1, 1, 1, 0, 1, 1, 1, 1, 1 },
+ /* ASM */ { 0, 0, 1, 0, 0, 1, 0, 0, 0 }
/* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX0X, and
CXX0X when no longer experimental (when all uses of identifiers
in the compiler have been audited for correct handling of
@@ -118,6 +119,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
CPP_OPTION (pfile, cplusplus_comments) = l->cplusplus_comments;
CPP_OPTION (pfile, digraphs) = l->digraphs;
CPP_OPTION (pfile, uliterals) = l->uliterals;
+ CPP_OPTION (pfile, rliterals) = l->rliterals;
}
/* Initialize library global state. */
@@ -464,6 +466,13 @@ cpp_init_builtins (cpp_reader *pfile, int hosted)
else if (CPP_OPTION (pfile, c99))
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
+ if (CPP_OPTION (pfile, uliterals)
+ && !CPP_OPTION (pfile, cplusplus))
+ {
+ _cpp_define_builtin (pfile, "__STDC_UTF_16__ 1");
+ _cpp_define_builtin (pfile, "__STDC_UTF_32__ 1");
+ }
+
if (hosted)
_cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
else
diff --git a/libcpp/lex.c b/libcpp/lex.c
index d460b98..463b5c8 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -1,6 +1,6 @@
/* CPP Library - lexical analysis.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
- Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010,
+ 2011 Free Software Foundation, Inc.
Contributed by Per Bothner, 1994-95.
Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987
@@ -2007,18 +2007,20 @@ _cpp_lex_direct (cpp_reader *pfile)
case 'R':
/* 'L', 'u', 'U', 'u8' or 'R' may introduce wide characters,
wide strings or raw strings. */
- if (c == 'L' || CPP_OPTION (pfile, uliterals))
+ if (c == 'L' || CPP_OPTION (pfile, rliterals)
+ || (c != 'R' && CPP_OPTION (pfile, uliterals)))
{
if ((*buffer->cur == '\'' && c != 'R')
|| *buffer->cur == '"'
|| (*buffer->cur == 'R'
&& c != 'R'
&& buffer->cur[1] == '"'
- && CPP_OPTION (pfile, uliterals))
+ && CPP_OPTION (pfile, rliterals))
|| (*buffer->cur == '8'
&& c == 'u'
&& (buffer->cur[1] == '"'
- || (buffer->cur[1] == 'R' && buffer->cur[2] == '"'))))
+ || (buffer->cur[1] == 'R' && buffer->cur[2] == '"'
+ && CPP_OPTION (pfile, rliterals)))))
{
lex_string (pfile, result, buffer->cur - 1);
break;