From 6e2993bf5b71c17c2b60e0dec787750f44925e66 Mon Sep 17 00:00:00 2001 From: Mark Mitchell <mark@codesourcery.com> Date: Wed, 24 Nov 2004 18:45:33 +0000 Subject: [PATCH] pt.c (tsubst_function_type): Do not permit function types which return arrays or functions. * pt.c (tsubst_function_type): Do not permit function types which return arrays or functions. * g++.dg/template/deduce3.C: New test. From-SVN: r91186 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 16 ++++++++++++++++ gcc/testsuite/ChangeLog | 2 ++ 3 files changed, 21 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index abfc86abb8a0..94f0d02e8519 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2004-11-24 Mark Mitchell <mark@codesourcery.com> + * pt.c (tsubst_function_type): Do not permit function types which + return arrays or functions. + PR c++/18586 * parser.c (cp_parser_init_declarator): Do not pop scope twice. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 34fd27b59936..c171f31b0838 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6732,6 +6732,22 @@ tsubst_function_type (tree t, return_type = tsubst (TREE_TYPE (t), args, complain, in_decl); if (return_type == error_mark_node) return error_mark_node; + /* The standard does not presently indicate that creation of a + function type with an invalid return type is a deduction failure. + However, that is clearly analagous to creating an array of "void" + or a reference to a reference. This is core issue #486. */ + if (TREE_CODE (return_type) == ARRAY_TYPE + || TREE_CODE (return_type) == FUNCTION_TYPE) + { + if (complain & tf_error) + { + if (TREE_CODE (return_type) == ARRAY_TYPE) + error ("function returning an array"); + else + error ("function returning a function"); + } + return error_mark_node; + } /* Substitute the argument types. */ arg_types = tsubst_arg_types (TYPE_ARG_TYPES (t), args, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d569fb719fb9..f647b33ca03b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2004-11-24 Mark Mitchell <mark@codesourcery.com> + * g++.dg/template/deduce3.C: New test. + PR c++/18586 * g++.dg/template/crash27.C: New test. -- GitLab