Blame SOURCES/gcc32-pr13106.patch

6f1b0c
2005-09-23  Alexandre Oliva  <aoliva@redhat.com>
6f1b0c
6f1b0c
	* decl.c (finish_function): Skip no-return-statment warning if
6f1b0c
	the return type uses template parms.
6f1b0c
6f1b0c
	* g++.dg/warn/return-void-1.C: New test.
6f1b0c
6f1b0c
--- gcc/cp/decl.c.orig
6f1b0c
+++ gcc/cp/decl.c
6f1b0c
@@ -14475,7 +14475,8 @@ finish_function (flags)
6f1b0c
       && !DECL_NAME (DECL_RESULT (fndecl))
6f1b0c
       /* Normally, with -Wreturn-type, flow will complain.  Unless we're an
6f1b0c
 	 inline function, as we might never be compiled separately.  */
6f1b0c
-      && (DECL_INLINE (fndecl) || processing_template_decl))
6f1b0c
+      && (DECL_INLINE (fndecl) || processing_template_decl)
6f1b0c
+      && !uses_template_parms (TREE_TYPE (fntype)))
6f1b0c
     warning ("no return statement in function returning non-void");
6f1b0c
     
6f1b0c
   /* Clear out memory we no longer need.  */
6f1b0c
--- gcc/testsuite/g++.dg/warn/return-void-1.C
6f1b0c
+++ gcc/testsuite/g++.dg/warn/return-void-1.C
6f1b0c
@@ -0,0 +1,15 @@
6f1b0c
+// { dg-do compile }
6f1b0c
+// { dg-options "-Wall" }
6f1b0c
+
6f1b0c
+template <typename T> T dummy1() {}
6f1b0c
+template <typename T> T dummy2() {} // { dg-warning "end of non-void" }
6f1b0c
+template <typename T> inline T dummy3() {}
6f1b0c
+template <typename T> inline T dummy4() {} // { dg-warning "end of non-void|no return statement" }
6f1b0c
+
6f1b0c
+int main()
6f1b0c
+{
6f1b0c
+  dummy1<void>();
6f1b0c
+  dummy2<int>(); // { dg-warning "instantiated from here" }
6f1b0c
+  dummy3<void>();
6f1b0c
+  dummy4<int>(); // { dg-warning "instantiated from here" }
6f1b0c
+}