Hi,

in this old bug Ian complained that the diagnostic we provide for:

typedef void v;
typedef v (*pf)(v);

is rather unfriendly, especially for people coming from C:

33101.C:2:17: error: ā€˜<anonymous>’ has incomplete type
33101.C:2:18: error: invalid use of ā€˜v’

thus Gaby (and Ian) suggested something along the lines of what I propose below. Today I also noticed that some front-ends also deal specially with cv-qualified void, thus added that case too, then just generically 'void' I think it's good enough.

Thanks,
Paolo.

//////////////
/cp
2014-06-12  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/33101
        * decl.c (grokparms): Improve error message about void parameters.

/testsuite
2014-06-12  Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/33101
        * g++.dg/other/void3.C: New.
        * g++.dg/conversion/err-recover1.C: Update.
Index: cp/decl.c
===================================================================
--- cp/decl.c   (revision 211574)
+++ cp/decl.c   (working copy)
@@ -11161,10 +11161,25 @@ grokparms (tree parmlist, tree *parms)
        {
          if (same_type_p (type, void_type_node)
              && DECL_SELF_REFERENCE_P (type)
-             && !DECL_NAME (decl) && !result && TREE_CHAIN (parm) == 
void_list_node)
+             && !DECL_NAME (decl) && !result
+             && TREE_CHAIN (parm) == void_list_node)
            /* this is a parmlist of `(void)', which is ok.  */
            break;
-         cxx_incomplete_type_error (decl, type);
+         else if (!cv_qualified_p (type)
+                  && !DECL_SELF_REFERENCE_P (type)
+                  && !DECL_NAME (decl) && !result
+                  && TREE_CHAIN (parm) == void_list_node)
+           error_at (DECL_SOURCE_LOCATION (decl),
+                     "invalid use of typedef-name for type "
+                     "%<void%> in parameter declaration");
+         else if (cv_qualified_p (type))
+           error_at (DECL_SOURCE_LOCATION (decl),
+                     "invalid use of cv-qualified type %<void%> "
+                     "in parameter declaration");
+         else
+           error_at (DECL_SOURCE_LOCATION (decl),
+                     "invalid use of type %<void%> in parameter "
+                     "declaration");
          /* It's not a good idea to actually create parameters of
             type `void'; other parts of the compiler assume that a
             void type terminates the parameter list.  */
Index: testsuite/g++.dg/conversion/err-recover1.C
===================================================================
--- testsuite/g++.dg/conversion/err-recover1.C  (revision 211574)
+++ testsuite/g++.dg/conversion/err-recover1.C  (working copy)
@@ -1,6 +1,6 @@
 // PR c++/42219
 
-void foo(const void);          // { dg-error "incomplete|const" }
+void foo(const void);          // { dg-error "invalid use of cv-qualified" }
 
 void bar()
 {
Index: testsuite/g++.dg/other/void3.C
===================================================================
--- testsuite/g++.dg/other/void3.C      (revision 0)
+++ testsuite/g++.dg/other/void3.C      (working copy)
@@ -0,0 +1,4 @@
+// PR c++/33101
+
+typedef void v;
+typedef v (*pf)(v);  // { dg-error "invalid use of typedef-name" }

Reply via email to