Re: [PATCH, PR C++/61038] - g++ -E is unusable with UDL strings
On 05/20/2014 04:44 PM, Jason Merrill wrote: On 05/13/2014 08:59 PM, Ed Smith-Rowland wrote: + escape_it = escape_it || cpp_userdef_string_p (token-type) +|| cpp_userdef_char_p (token-type); Let's add the new cases to the previous statement instead of a new one. OK with that change. Jason PR c++/61038 I was asked to combine the escape logic for regular chars and strings with the escape logic for user-defined literals chars and strings. I just forgot the first time. After rebuilding and testing committed as obvious. ed@bad-horse:~/gcc_literal$ svn diff -rPREV libcpp/ChangeLog libcpp/macro.c Index: libcpp/ChangeLog === --- libcpp/ChangeLog(revision 211266) +++ libcpp/ChangeLog(working copy) @@ -1,3 +1,9 @@ +2014-06-04 Edward Smith-Rowland 3dw...@verizon.net + +PR c++/61038 +* macro.c (stringify_arg (cpp_reader *, macro_arg *)): +Combine user-defined escape logic with the other string and char logic. + 2014-05-26 Richard Biener rguent...@suse.de * configure.ac: Remove long long and __int64 type checks, Index: libcpp/macro.c === --- libcpp/macro.c(revision 211265) +++ libcpp/macro.c(working copy) @@ -492,11 +492,10 @@ || token-type == CPP_WSTRING || token-type == CPP_WCHAR || token-type == CPP_STRING32 || token-type == CPP_CHAR32 || token-type == CPP_STRING16 || token-type == CPP_CHAR16 - || token-type == CPP_UTF8STRING); + || token-type == CPP_UTF8STRING + || cpp_userdef_string_p (token-type) + || cpp_userdef_char_p (token-type)); - 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);
Re: [PATCH, PR C++/61038] - g++ -E is unusable with UDL strings
Ed Smith-Rowland 3dw...@verizon.net writes: Index: ../gcc/testsuite/g++.dg/cpp0x/pr61038.C === --- ../gcc/testsuite/g++.dg/cpp0x/pr61038.C (revision 0) +++ ../gcc/testsuite/g++.dg/cpp0x/pr61038.C (working copy) @@ -0,0 +1,23 @@ +// PR c++/61038 +// { dg-do compile { target c++11 } } +// { dg-options -E } + +void +operator _s(const char *, unsigned long) ../../gcc/gcc/testsuite/g++.dg/cpp0x/pr61038.C:8:43: error: ‘void operator_s(const char*, long unsigned int)’ has invalid argument list Andreas. * g++.dg/cpp0x/pr61038.C (operator _s): Use size_t. Index: g++.dg/cpp0x/pr61038.C === --- g++.dg/cpp0x/pr61038.C (revision 210686) +++ g++.dg/cpp0x/pr61038.C (working copy) @@ -5,7 +5,7 @@ #include cstdlib void -operator _s(const char *, unsigned long) +operator _s(const char *, size_t) { } void -- Andreas Schwab, SUSE Labs, sch...@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 And now for something completely different.
Re: [PATCH, PR C++/61038] - g++ -E is unusable with UDL strings
On 05/13/2014 08:59 PM, Ed Smith-Rowland wrote: + escape_it = escape_it || cpp_userdef_string_p (token-type) + || cpp_userdef_char_p (token-type); Let's add the new cases to the previous statement instead of a new one. OK with that change. Jason
Re: [PATCH, PR C++/61038] - g++ -E is unusable with UDL strings
On Mon, 12 May 2014, Ed Smith-Rowland wrote: This patch is really a libcpp patch. But UDLs are like that ;-) Add string user-defined literals and char user-defined literals to the list of things to look out for while escaping strings in macro args. I'm not sure how to test this really. we want to write out *.ii files and verify that internal quotes are escaped. You should be able to check the results of stringizing twice, e.g.: extern C int strcmp (const char *, const char *); extern C void abort (void); extern C void exit (int); void operator _s(const char *, unsigned long) { } #define QUOTE(s) #s #define QQUOTE(s) QUOTE(s) const char *s = QQUOTE(QUOTE(hello_s)); const char *t = QUOTE(\hello\_s); int main() { if (strcmp(s, t) == 0) exit(0); else abort(); } (at least, this fails for me with unmodified GCC, and I think it should pass). -- Joseph S. Myers jos...@codesourcery.com
Re: [PATCH, PR C++/61038] - g++ -E is unusable with UDL strings
On 05/13/2014 01:29 PM, Joseph S. Myers wrote: On Mon, 12 May 2014, Ed Smith-Rowland wrote: This patch is really a libcpp patch. But UDLs are like that ;-) Add string user-defined literals and char user-defined literals to the list of things to look out for while escaping strings in macro args. I'm not sure how to test this really. we want to write out *.ii files and verify that internal quotes are escaped. You should be able to check the results of stringizing twice, e.g.: extern C int strcmp (const char *, const char *); extern C void abort (void); extern C void exit (int); void operator _s(const char *, unsigned long) { } #define QUOTE(s) #s #define QQUOTE(s) QUOTE(s) const char *s = QQUOTE(QUOTE(hello_s)); const char *t = QUOTE(\hello\_s); int main() { if (strcmp(s, t) == 0) exit(0); else abort(); } (at least, this fails for me with unmodified GCC, and I think it should pass). Thank you Joe! Here is a new patch with a proper test case. Built and tested on x86_64-linux. OK? Ed Index: macro.c === --- macro.c (revision 210315) +++ macro.c (working copy) @@ -494,6 +494,9 @@ || 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); Index: ../gcc/testsuite/g++.dg/cpp0x/pr61038.C === --- ../gcc/testsuite/g++.dg/cpp0x/pr61038.C (revision 0) +++ ../gcc/testsuite/g++.dg/cpp0x/pr61038.C (working copy) @@ -0,0 +1,40 @@ +// PR c++/61038 +// { dg-do compile { target c++11 } } + +#include cstring +#include cstdlib + +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(); +} libcpp/ 2014-05-12 Edward Smith-Rowland 3dw...@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. gcc/testsuite/ 2014-05-12 Edward Smith-Rowland 3dw...@verizon.net PR C++/61038 * g++.dg/cpp0x/pr61038.C: New.
[PATCH, PR C++/61038] - g++ -E is unusable with UDL strings
This patch is really a libcpp patch. But UDLs are like that ;-) Add string user-defined literals and char user-defined literals to the list of things to look out for while escaping strings in macro args. I'm not sure how to test this really. we want to write out *.ii files and verify that internal quotes are escaped. Built and tested on x86_64-linux. OK? libcpp/ 2014-05-12 Edward Smith-Rowland 3dw...@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. gcc/testsuite/ 2014-05-12 Edward Smith-Rowland 3dw...@verizon.net PR C++/61038 * g++.dg/cpp0x/pr61038.C: New. Index: macro.c === --- macro.c (revision 210315) +++ macro.c (working copy) @@ -494,6 +494,9 @@ || 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); Index: ../gcc/testsuite/g++.dg/cpp0x/pr61038.C === --- ../gcc/testsuite/g++.dg/cpp0x/pr61038.C (revision 0) +++ ../gcc/testsuite/g++.dg/cpp0x/pr61038.C (working copy) @@ -0,0 +1,23 @@ +// PR c++/61038 +// { dg-do compile { target c++11 } } +// { dg-options -E } + +void +operator _s(const char *, unsigned long) +{ } + +void +operator _t(const char) +{ } + +#define QUOTE(s) #s + +int +main() +{ + QUOTE(hello_s); + + QUOTE(''_t); + QUOTE('\''_t); + QUOTE('\\'_t); +}