diff mbox

[PR,c++/58072,C++11]

Message ID 51FDFE7E.9040104@verizon.net
State New
Headers show

Commit Message

Ed Smith-Rowland Aug. 4, 2013, 7:10 a.m. UTC
This was a bug concerning reporting of compiler errors involving 
user-defined literals.
The error messages would appear with token names 'CPP_STRING_USERDEF', etc.
This is very cryptic for the user.

This patch just catches user-defined literal tokens in 
c-family/c-common.c/c_parse_error() and inserts useful phrases in the 
error messages.

Built and tested on x86-64-linux.

OK?

Ed
gcc/c-family:

2013-08-04  Ed Smith-Rowland  <3dw4rd@verizon.net>

	PR c++/58072
	* c-common.c (c_parse_error): Catch user-defined literal tokens and
	provide useful error strings.


gcc/testsuite:

	PR c++/58072
	* g++.dg/cpp0x/pr58072.C: New.

Comments

Jason Merrill Aug. 4, 2013, 4:23 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

Index: c-family/c-common.c
===================================================================
--- c-family/c-common.c	(revision 201466)
+++ c-family/c-common.c	(working copy)
@@ -9352,6 +9352,18 @@ 
       free (message);
       message = NULL;
     }
+  else if (token_type == CPP_CHAR_USERDEF
+	   || token_type == CPP_WCHAR_USERDEF
+	   || token_type == CPP_CHAR16_USERDEF
+	   || token_type == CPP_CHAR32_USERDEF)
+    message = catenate_messages (gmsgid,
+				 " before user-defined character literal");
+  else if (token_type == CPP_STRING_USERDEF
+	   || token_type == CPP_WSTRING_USERDEF
+	   || token_type == CPP_STRING16_USERDEF
+	   || token_type == CPP_STRING32_USERDEF
+	   || token_type == CPP_UTF8STRING_USERDEF)
+    message = catenate_messages (gmsgid, " before user-defined string literal");
   else if (token_type == CPP_STRING
 	   || token_type == CPP_WSTRING
 	   || token_type == CPP_STRING16
Index: testsuite/g++.dg/cpp0x/pr58072.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr58072.C	(revision 0)
+++ testsuite/g++.dg/cpp0x/pr58072.C	(working copy)
@@ -0,0 +1,18 @@ 
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+
+// PR c++/58072
+
+extern 'c'void*blah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+extern L'c'void*Lblah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+extern u'c'void*ublah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+extern U'c'void*Ublah(void*); // { dg-error "expected unqualified-id before user-defined character literal" }
+
+extern "c"void*strblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern L"c"void*Lstrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern u"c"void*ustrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern U"c"void*Ustrblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+extern u8"c"void*u8strblah(void*); // { dg-error "expected unqualified-id before user-defined string literal" }
+
+extern 123void*ULLblah(void*); // { dg-error "expected unqualified-id before numeric constant" }
+extern 123.456void*Ldblblah(void*); // { dg-error "expected unqualified-id before numeric constant" }