Re: [PATCH][C++11][ PR55582] Let string literals starting with lower-case 's' be a user-defined literal instead of string + macro.
I just noticed this patch. Since it was submitted well before the end of stage 3 and looks quite safe, it's OK to go in for 4.8. Please remember to CC/ping me for C++ patches. Thanks, Jason
Re: [PATCH][C++11][ PR55582] Let string literals starting with lower-case 's' be a user-defined literal instead of string + macro.
On 02/13/2013 01:40 PM, Jason Merrill wrote: I just noticed this patch. Since it was submitted well before the end of stage 3 and looks quite safe, it's OK to go in for 4.8. Please remember to CC/ping me for C++ patches. Thanks, Jason Applied the following after build and test on x86_64-unknown-linux. Ed Index: gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C === --- gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C (revision 0) @@ -0,0 +1,13 @@ +// { dg-options -std=c++11 } +// { dg-require-effective-target stdint_types } +// PR c++/55582 + +#include udlit-string-literal.h + +using namespace my_string_literals; + +decltype(Hello, World!s) s; +decltype(u8Hello, World!s) s8; +decltype(LHello, World!s) ws; +decltype(uHello, World!s) s16; +decltype(UHello, World!s) s32; Index: gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h === --- gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h (revision 0) @@ -0,0 +1,22 @@ +#pragma GCC system_header + +#include string + +inline namespace my_string_literals +{ + std::string + operator s(const char* str, std::size_t len) + { return std::string{str, len}; } + + std::wstring + operator s(const wchar_t* str, std::size_t len) + { return std::wstring{str, len}; } + + std::u16string + operator s(const char16_t* str, std::size_t len) + { return std::u16string{str, len}; } + + std::u32string + operator s(const char32_t* str, std::size_t len) + { return std::u32string{str, len}; } +} Index: libcpp/lex.c === --- libcpp/lex.c(revision 196036) +++ libcpp/lex.c(working copy) @@ -1561,8 +1561,10 @@ from inttypes.h, we generate a warning and treat the ud-suffix as a separate preprocessing token. This approach is under discussion by the standards committee, and has been adopted as a conforming -extension by other front ends such as clang. */ - if (ISALPHA (*cur)) +extension by other front ends such as clang. + A special exception is made for the suffix 's' which will be +standardized as a user-defined literal suffix for strings. */ + if (ISALPHA (*cur) *cur != 's') { /* Raise a warning, but do not consume subsequent tokens. */ if (CPP_OPTION (pfile, warn_literal_suffix)) @@ -1572,7 +1574,7 @@ a space between literal and identifier); } /* Grab user defined literal suffix. */ - else if (*cur == '_') + else if (ISIDST (*cur)) { type = cpp_userdef_string_add_type (type); ++cur; @@ -1692,8 +1694,10 @@ from inttypes.h, we generate a warning and treat the ud-suffix as a separate preprocessing token. This approach is under discussion by the standards committee, and has been adopted as a conforming -extension by other front ends such as clang. */ - if (ISALPHA (*cur)) +extension by other front ends such as clang. + A special exception is made for the suffix 's' which will be +standardized as a user-defined literal suffix for strings. */ + if (ISALPHA (*cur) *cur != 's') { /* Raise a warning, but do not consume subsequent tokens. */ if (CPP_OPTION (pfile, warn_literal_suffix)) @@ -1703,7 +1707,7 @@ a space between literal and identifier); } /* Grab user defined literal suffix. */ - else if (*cur == '_') + else if (ISIDST (*cur)) { type = cpp_userdef_char_add_type (type); type = cpp_userdef_string_add_type (type); gcc/libcpp/ 2013-02-13 Ed Smith-Rowland 3dw...@verizon.net PR c++/55582 * libcpp/lex.c (lex_raw_string): Allow string literal with suffix beginning with 's' to be parsed as a C++11 user-defined literal. gcc/testsuite/ 2013-02-13 Ed Smith-Rowland 3dw...@verizon.net PR c++/55582 * g++.dg/cpp0x/udlit-string-literal.h: New. * g++.dg/cpp0x/udlit-string-literal.C: New.
[PATCH][C++11][ PR55582] Let string literals starting with lower-case 's' be a user-defined literal instead of string + macro.
There is a proposal to add several user-defined literals to the standard library that looks like it will probably go through: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3468.pdf The proposed string literals std::string hw = Hello, world!s; will not parse as a literal in gcc. This patch fixes this by modifying the lexing of stringXYZ user-defined literals as *two* tokens if the suffix starts with a letter *unless the letter is a lower-case 's'*. i.e. don't parse as a user-defined literal but as a sequence of string and macro *unless starts with lower case 's'*. The original code parsed all string literals with suffix beginning with any letter as a sequence of string and macro (two tokens, not one). Thanks, Index: libcpp/lex.c === --- libcpp/lex.c(revision 194178) +++ libcpp/lex.c(working copy) @@ -1562,8 +1562,10 @@ from inttypes.h, we generate a warning and treat the ud-suffix as a separate preprocessing token. This approach is under discussion by the standards committee, and has been adopted as a conforming -extension by other front ends such as clang. */ - if (ISALPHA (*cur)) +extension by other front ends such as clang. + A special exception is made for the suffix 's' which will be +standardized as a user-defined literal suffix for strings. */ + if (ISALPHA (*cur) *cur != 's') { /* Raise a warning, but do not consume subsequent tokens. */ if (CPP_OPTION (pfile, warn_literal_suffix)) @@ -1573,7 +1575,7 @@ a space between literal and identifier); } /* Grab user defined literal suffix. */ - else if (*cur == '_') + else if (ISIDST (*cur)) { type = cpp_userdef_string_add_type (type); ++cur; @@ -1693,8 +1695,10 @@ from inttypes.h, we generate a warning and treat the ud-suffix as a separate preprocessing token. This approach is under discussion by the standards committee, and has been adopted as a conforming -extension by other front ends such as clang. */ - if (ISALPHA (*cur)) +extension by other front ends such as clang. + A special exception is made for the suffix 's' which will be +standardized as a user-defined literal suffix for strings. */ + if (ISALPHA (*cur) *cur != 's') { /* Raise a warning, but do not consume subsequent tokens. */ if (CPP_OPTION (pfile, warn_literal_suffix)) @@ -1704,7 +1708,7 @@ a space between literal and identifier); } /* Grab user defined literal suffix. */ - else if (*cur == '_') + else if (ISIDST (*cur)) { type = cpp_userdef_char_add_type (type); type = cpp_userdef_string_add_type (type); Index: gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C === --- gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.C (revision 0) @@ -0,0 +1,12 @@ +// { dg-options -std=c++11 } +// PR c++/55582 + +#include udlit-string-literal.h + +using namespace my_string_literals; + +decltype(Hello, World!s) s; +decltype(u8Hello, World!s) s8; +decltype(LHello, World!s) ws; +decltype(uHello, World!s) s16; +decltype(UHello, World!s) s32; Index: gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h === --- gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h (revision 0) +++ gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h (revision 0) @@ -0,0 +1,22 @@ +#pragma GCC system_header + +#include string + +inline namespace my_string_literals +{ + std::string + operator s(const char* str, std::size_t len) + { return std::string{str, len}; } + + std::wstring + operator s(const wchar_t* str, std::size_t len) + { return std::wstring{str, len}; } + + std::u16string + operator s(const char16_t* str, std::size_t len) + { return std::u16string{str, len}; } + + std::u32string + operator s(const char32_t* str, std::size_t len) + { return std::u32string{str, len}; } +} gcc/libcpp/ 2012-12-05 Ed Smith-Rowland 3dw...@verizon.net PR c++/55582 * lex.c (lex_raw_string): Allow string literal with suffix starting with lower-case 's' as a user-defined literal. (lex_string): Ditto. gcc/testsuite/ 2012-12-05 Ed Smith-Rowland 3dw...@verizon.net PR c++/55582 * g++.dg/cpp0x/udlit-string-literal.h: New. * g++.dg/cpp0x/udlit-string-literal.C: New.