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