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 <3dw...@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.
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" }