Commit 045af2d7 by Paolo Carlini Committed by Paolo Carlini

re PR c++/33101 ([DR 577] allow typedefs for void in empty parameter list)

/cp
2014-06-14  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/33101
	* decl.c (grokparms): Improve error message about void parameters.
	* error.c (type_to_string): Fix aka cut off code.

/testsuite
2014-06-14  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/33101
	* g++.dg/other/void3.C: New.
	* g++.dg/conversion/err-recover1.C: Update.

From-SVN: r211673
parent fb3bc977
2014-06-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/33101
* decl.c (grokparms): Improve error message about void parameters.
* error.c (type_to_string): Fix aka cut off code.
2014-06-12 Jason Merrill <jason@redhat.com> 2014-06-12 Jason Merrill <jason@redhat.com>
* call.c (convert_arg_to_ellipsis): Use abi_version_crosses. * call.c (convert_arg_to_ellipsis): Use abi_version_crosses.
......
...@@ -11137,12 +11137,24 @@ grokparms (tree parmlist, tree *parms) ...@@ -11137,12 +11137,24 @@ grokparms (tree parmlist, tree *parms)
type = TREE_TYPE (decl); type = TREE_TYPE (decl);
if (VOID_TYPE_P (type)) if (VOID_TYPE_P (type))
{ {
if (same_type_p (type, void_type_node) if (type == void_type_node
&& DECL_SELF_REFERENCE_P (type) && !init
&& !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. */ /* this is a parmlist of `(void)', which is ok. */
break; break;
cxx_incomplete_type_error (decl, type); else if (typedef_variant_p (type))
error_at (DECL_SOURCE_LOCATION (decl),
"invalid use of typedef-name %qT in "
"parameter declaration", type);
else if (cv_qualified_p (type))
error_at (DECL_SOURCE_LOCATION (decl),
"invalid use of cv-qualified type %qT in "
"parameter declaration", type);
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 /* It's not a good idea to actually create parameters of
type `void'; other parts of the compiler assume that a type `void'; other parts of the compiler assume that a
void type terminates the parameter list. */ void type terminates the parameter list. */
......
...@@ -2922,7 +2922,7 @@ type_to_string (tree typ, int verbose) ...@@ -2922,7 +2922,7 @@ type_to_string (tree typ, int verbose)
if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (typ) if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (typ)
&& !uses_template_parms (typ)) && !uses_template_parms (typ))
{ {
int aka_start; char *p; int aka_start, aka_len; char *p;
struct obstack *ob = pp_buffer (cxx_pp)->obstack; struct obstack *ob = pp_buffer (cxx_pp)->obstack;
/* Remember the end of the initial dump. */ /* Remember the end of the initial dump. */
int len = obstack_object_size (ob); int len = obstack_object_size (ob);
...@@ -2932,10 +2932,11 @@ type_to_string (tree typ, int verbose) ...@@ -2932,10 +2932,11 @@ type_to_string (tree typ, int verbose)
/* And remember the start of the aka dump. */ /* And remember the start of the aka dump. */
aka_start = obstack_object_size (ob); aka_start = obstack_object_size (ob);
dump_type (cxx_pp, aka, flags); dump_type (cxx_pp, aka, flags);
aka_len = obstack_object_size (ob) - aka_start;
pp_right_brace (cxx_pp); pp_right_brace (cxx_pp);
p = (char*)obstack_base (ob); p = (char*)obstack_base (ob);
/* If they are identical, cut off the aka with a NUL. */ /* If they are identical, cut off the aka with a NUL. */
if (memcmp (p, p+aka_start, len) == 0) if (len == aka_len && memcmp (p, p+aka_start, len) == 0)
p[len] = '\0'; p[len] = '\0';
} }
return pp_ggc_formatted_text (cxx_pp); return pp_ggc_formatted_text (cxx_pp);
......
2014-06-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/33101
* g++.dg/other/void3.C: New.
* g++.dg/conversion/err-recover1.C: Update.
2014-06-13 Peter Bergner <bergner@vnet.ibm.com> 2014-06-13 Peter Bergner <bergner@vnet.ibm.com>
PR target/61415 PR target/61415
......
// PR c++/42219 // PR c++/42219
void foo(const void); // { dg-error "incomplete|const" } void foo(const void); // { dg-error "invalid use of cv-qualified" }
void bar() void bar()
{ {
......
// PR c++/33101
typedef void v;
typedef v (*pf)(v); // { dg-error "invalid use of typedef-name" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment