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

login
register
mail settings
Submitter Ed Smith-Rowland
Date Feb. 14, 2013, 2:57 a.m.
Message ID <511C5290.9060207@verizon.net>
Download mbox | patch
Permalink /patch/220337/
State New
Headers show

Comments

Ed Smith-Rowland - Feb. 14, 2013, 2:57 a.m.
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

gcc/libcpp/

2013-02-13  Ed Smith-Rowland  <3dw4rd@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  <3dw4rd@verizon.net>

	PR c++/55582
	* g++.dg/cpp0x/udlit-string-literal.h: New.
	* g++.dg/cpp0x/udlit-string-literal.C: New.

Patch

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(u8"Hello, World!"s) s8;
+decltype(L"Hello, World!"s) ws;
+decltype(u"Hello, World!"s) s16;
+decltype(U"Hello, 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);