Re: [PATCH][C++11][ PR55582] Let string literals starting with lower-case 's' be a user-defined literal instead of string + macro.

2013-02-13 Thread Jason Merrill
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.

2013-02-13 Thread Ed Smith-Rowland

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.

2012-12-05 Thread Ed Smith-Rowland
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.