re PR c++/55582 ([C++11] Unable to define string user-defined literal without leading underscore.)

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.

From-SVN: r196041
This commit is contained in:
Ed Smith-Rowland 2013-02-14 02:55:42 +00:00 committed by Edward Smith-Rowland
parent 94504fd484
commit 561f7fc72c
5 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,9 @@
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.
2013-02-13 Sriraman Tallam <tmsriram@google.com>
* g++.dg/ext/mv12-aux.C: Add directives to match mv12.C.

View File

@ -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;

View File

@ -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}; }
}

View File

@ -1,3 +1,9 @@
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.
2013-01-14 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years.

View File

@ -1561,8 +1561,10 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
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 @@ lex_raw_string (cpp_reader *pfile, cpp_token *token, const uchar *base,
"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 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
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 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base)
"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);