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" }

Reply via email to