mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
3b6fa7a5c6
commit
a48e3dd10e
|
@ -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>
|
2011-08-18 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
PR fortran/18918
|
PR fortran/18918
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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" } */
|
|
@ -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>
|
2011-08-15 Gabriel Charette <gchare@google.com>
|
||||||
|
|
||||||
* include/line-map.h (LINEMAP_POSITION_FOR_COLUMN): Remove.
|
* include/line-map.h (LINEMAP_POSITION_FOR_COLUMN): Remove.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Definitions for CPP library.
|
/* Definitions for CPP library.
|
||||||
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
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.
|
Free Software Foundation, Inc.
|
||||||
Written by Per Bothner, 1994-95.
|
Written by Per Bothner, 1994-95.
|
||||||
|
|
||||||
|
@ -315,6 +315,10 @@ struct cpp_options
|
||||||
/* Nonzero means process u/U prefix literals (UTF-16/32). */
|
/* Nonzero means process u/U prefix literals (UTF-16/32). */
|
||||||
unsigned char uliterals;
|
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). */
|
/* Nonzero means print names of header files (-H). */
|
||||||
unsigned char print_include_names;
|
unsigned char print_include_names;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* CPP Library.
|
/* CPP Library.
|
||||||
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
|
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.
|
Contributed by Per Bothner, 1994-95.
|
||||||
Based on CCCP program by Paul Rubin, June 1986
|
Based on CCCP program by Paul Rubin, June 1986
|
||||||
Adapted to ANSI C, Richard Stallman, Jan 1987
|
Adapted to ANSI C, Richard Stallman, Jan 1987
|
||||||
|
@ -79,22 +79,23 @@ struct lang_flags
|
||||||
char cplusplus_comments;
|
char cplusplus_comments;
|
||||||
char digraphs;
|
char digraphs;
|
||||||
char uliterals;
|
char uliterals;
|
||||||
|
char rliterals;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct lang_flags lang_defaults[] =
|
static const struct lang_flags lang_defaults[] =
|
||||||
{ /* c99 c++ xnum xid std // digr ulit */
|
{ /* c99 c++ xnum xid std // digr ulit rlit */
|
||||||
/* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0 },
|
/* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0, 0 },
|
||||||
/* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1 },
|
/* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 1 },
|
||||||
/* GNUC1X */ { 1, 0, 1, 0, 0, 1, 1, 1 },
|
/* GNUC1X */ { 1, 0, 1, 0, 0, 1, 1, 1, 1 },
|
||||||
/* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0 },
|
/* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0, 0 },
|
||||||
/* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0 },
|
/* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0, 0 },
|
||||||
/* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0 },
|
/* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0, 0 },
|
||||||
/* STDC1X */ { 1, 0, 1, 0, 1, 1, 1, 0 },
|
/* STDC1X */ { 1, 0, 1, 0, 1, 1, 1, 1, 0 },
|
||||||
/* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0 },
|
/* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0, 0 },
|
||||||
/* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0 },
|
/* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0, 0 },
|
||||||
/* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1, 1 },
|
/* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1, 1, 1 },
|
||||||
/* CXX0X */ { 1, 1, 1, 0, 1, 1, 1, 1 },
|
/* CXX0X */ { 1, 1, 1, 0, 1, 1, 1, 1, 1 },
|
||||||
/* ASM */ { 0, 0, 1, 0, 0, 1, 0, 0 }
|
/* ASM */ { 0, 0, 1, 0, 0, 1, 0, 0, 0 }
|
||||||
/* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX0X, and
|
/* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX0X, and
|
||||||
CXX0X when no longer experimental (when all uses of identifiers
|
CXX0X when no longer experimental (when all uses of identifiers
|
||||||
in the compiler have been audited for correct handling of
|
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, cplusplus_comments) = l->cplusplus_comments;
|
||||||
CPP_OPTION (pfile, digraphs) = l->digraphs;
|
CPP_OPTION (pfile, digraphs) = l->digraphs;
|
||||||
CPP_OPTION (pfile, uliterals) = l->uliterals;
|
CPP_OPTION (pfile, uliterals) = l->uliterals;
|
||||||
|
CPP_OPTION (pfile, rliterals) = l->rliterals;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize library global state. */
|
/* Initialize library global state. */
|
||||||
|
@ -464,6 +466,13 @@ cpp_init_builtins (cpp_reader *pfile, int hosted)
|
||||||
else if (CPP_OPTION (pfile, c99))
|
else if (CPP_OPTION (pfile, c99))
|
||||||
_cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L");
|
_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)
|
if (hosted)
|
||||||
_cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
|
_cpp_define_builtin (pfile, "__STDC_HOSTED__ 1");
|
||||||
else
|
else
|
||||||
|
|
12
libcpp/lex.c
12
libcpp/lex.c
|
@ -1,6 +1,6 @@
|
||||||
/* CPP Library - lexical analysis.
|
/* CPP Library - lexical analysis.
|
||||||
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
|
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010,
|
||||||
Free Software Foundation, Inc.
|
2011 Free Software Foundation, Inc.
|
||||||
Contributed by Per Bothner, 1994-95.
|
Contributed by Per Bothner, 1994-95.
|
||||||
Based on CCCP program by Paul Rubin, June 1986
|
Based on CCCP program by Paul Rubin, June 1986
|
||||||
Adapted to ANSI C, Richard Stallman, Jan 1987
|
Adapted to ANSI C, Richard Stallman, Jan 1987
|
||||||
|
@ -2007,18 +2007,20 @@ _cpp_lex_direct (cpp_reader *pfile)
|
||||||
case 'R':
|
case 'R':
|
||||||
/* 'L', 'u', 'U', 'u8' or 'R' may introduce wide characters,
|
/* 'L', 'u', 'U', 'u8' or 'R' may introduce wide characters,
|
||||||
wide strings or raw strings. */
|
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')
|
if ((*buffer->cur == '\'' && c != 'R')
|
||||||
|| *buffer->cur == '"'
|
|| *buffer->cur == '"'
|
||||||
|| (*buffer->cur == 'R'
|
|| (*buffer->cur == 'R'
|
||||||
&& c != 'R'
|
&& c != 'R'
|
||||||
&& buffer->cur[1] == '"'
|
&& buffer->cur[1] == '"'
|
||||||
&& CPP_OPTION (pfile, uliterals))
|
&& CPP_OPTION (pfile, rliterals))
|
||||||
|| (*buffer->cur == '8'
|
|| (*buffer->cur == '8'
|
||||||
&& c == 'u'
|
&& c == 'u'
|
||||||
&& (buffer->cur[1] == '"'
|
&& (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);
|
lex_string (pfile, result, buffer->cur - 1);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue