aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-06-14 22:55:40 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-06-14 22:55:40 +0000
commit045af2d75a12163df1c36f7c787126722536c1d7 (patch)
tree87977ec332800831deddf811071c19a9e6b2e099
parentfb3bc97798b9a2a0e5602c097319dc22d1dba708 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/decl.c20
-rw-r--r--gcc/cp/error.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/conversion/err-recover1.C2
-rw-r--r--gcc/testsuite/g++.dg/other/void3.C4
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" }