diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 121cc1968e4..142c9fa08a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-05-20 Edward Smith-Rowland <3dw4rd@verizon.net> + + PR C++/61038 + * g++.dg/cpp0x/pr61038.C: New. + 2014-05-20 Paolo Carlini PR c++/58753 diff --git a/gcc/testsuite/g++.dg/cpp0x/pr61038.C b/gcc/testsuite/g++.dg/cpp0x/pr61038.C new file mode 100644 index 00000000000..b773000d359 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr61038.C @@ -0,0 +1,40 @@ +// PR c++/61038 +// { dg-do compile { target c++11 } } + +#include +#include + +void +operator "" _s(const char *, unsigned long) +{ } + +void +operator "" _t(const char) +{ } + +#define QUOTE(s) #s +#define QQUOTE(s) QUOTE(s) + +int +main() +{ + const char *s = QQUOTE(QUOTE("hello"_s)); + const char *t = QUOTE("\"hello\"_s"); + if (strcmp(s, t) != 0) + abort(); + + const char *c = QQUOTE(QUOTE('"'_t)); + const char *d = QUOTE("'\"'_t"); + if (strcmp(c, d) != 0) + abort(); + + const char *e = QQUOTE(QUOTE('\''_t)); + const char *f = QUOTE("'\\''_t"); + if (strcmp(e, f) != 0) + abort(); + + const char *g = QQUOTE(QUOTE('\\'_t)); + const char *h = QUOTE("'\\\\'_t"); + if (strcmp(g, h) != 0) + abort(); +} diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index e767aa518db..bb44d3ce5b3 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2014-05-20 Edward Smith-Rowland <3dw4rd@verizon.net> + + PR C++/61038 + * macro.c (stringify_arg (cpp_reader *, macro_arg *)): + Check for user-defined literal strings and user-defined literal chars + to escape necessary characters. + 2014-05-20 Richard Biener * configure.ac: Copy gcc logic of detecting a 64bit type. diff --git a/libcpp/macro.c b/libcpp/macro.c index 11e50f4849c..c3db9a277a3 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -494,6 +494,9 @@ stringify_arg (cpp_reader *pfile, macro_arg *arg) || token->type == CPP_STRING16 || token->type == CPP_CHAR16 || token->type == CPP_UTF8STRING); + escape_it = escape_it || cpp_userdef_string_p (token->type) + || cpp_userdef_char_p (token->type); + /* Room for each char being written in octal, initial space and final quote and NUL. */ len = cpp_token_len (token);