diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-06-14 22:55:40 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-06-14 22:55:40 +0000 |
commit | 045af2d75a12163df1c36f7c787126722536c1d7 (patch) | |
tree | 87977ec332800831deddf811071c19a9e6b2e099 | |
parent | fb3bc97798b9a2a0e5602c097319dc22d1dba708 (diff) | |
download | gcc-045af2d75a12163df1c36f7c787126722536c1d7.zip gcc-045af2d75a12163df1c36f7c787126722536c1d7.tar.gz gcc-045af2d75a12163df1c36f7c787126722536c1d7.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 20 | ||||
-rw-r--r-- | gcc/cp/error.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/conversion/err-recover1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/void3.C | 4 |
6 files changed, 36 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5fac4a5..52744d8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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> * call.c (convert_arg_to_ellipsis): Use abi_version_crosses. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c472ee5..2908224 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11137,12 +11137,24 @@ grokparms (tree parmlist, tree *parms) type = TREE_TYPE (decl); if (VOID_TYPE_P (type)) { - if (same_type_p (type, void_type_node) - && DECL_SELF_REFERENCE_P (type) - && !DECL_NAME (decl) && !result && TREE_CHAIN (parm) == void_list_node) + if (type == void_type_node + && !init + && !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 (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 type `void'; other parts of the compiler assume that a void type terminates the parameter list. */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index b3b5bbb..27a167a 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2922,7 +2922,7 @@ type_to_string (tree typ, int verbose) if (typ && TYPE_P (typ) && typ != TYPE_CANONICAL (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; /* Remember the end of the initial dump. */ int len = obstack_object_size (ob); @@ -2932,10 +2932,11 @@ type_to_string (tree typ, int verbose) /* And remember the start of the aka dump. */ aka_start = obstack_object_size (ob); dump_type (cxx_pp, aka, flags); + aka_len = obstack_object_size (ob) - aka_start; pp_right_brace (cxx_pp); p = (char*)obstack_base (ob); /* 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'; } return pp_ggc_formatted_text (cxx_pp); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 919185d..a9b14dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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> PR target/61415 diff --git a/gcc/testsuite/g++.dg/conversion/err-recover1.C b/gcc/testsuite/g++.dg/conversion/err-recover1.C index 9723789..4773b1f 100644 --- a/gcc/testsuite/g++.dg/conversion/err-recover1.C +++ b/gcc/testsuite/g++.dg/conversion/err-recover1.C @@ -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() { diff --git a/gcc/testsuite/g++.dg/other/void3.C b/gcc/testsuite/g++.dg/other/void3.C new file mode 100644 index 0000000..3494d2a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/void3.C @@ -0,0 +1,4 @@ +// PR c++/33101 + +typedef void v; +typedef v (*pf)(v); // { dg-error "invalid use of typedef-name" } |