tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test after template instantiation.
authorRichard Henderson <rth@redhat.com>
Mon, 17 Jun 2002 00:26:56 +0000 (17:26 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 17 Jun 2002 00:26:56 +0000 (17:26 -0700)
        * tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test
        after template instantiation.
* g++.dg/opt/inline3.C: New.

From-SVN: r54687

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/g++.dg/opt/inline3.C [new file with mode: 0644]

index 707ee6f04e3f610ac1032a8772d8c5f0309d9b67..4da4bd4b779dea52ff4bab915ff2551c470ded7e 100644 (file)
@@ -1,3 +1,9 @@
+2002-06-16  Richard Henderson  <rth@redhat.com>
+
+       PR opt/6793
+       * tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test
+       after template instantiation.
+
 2002-06-16  Richard Henderson  <rth@redhat.com>
 
        * cp-tree.h, decl2.c (flag_ms_extensions): Move to c-common.
index 0752d7bc8dc99f00bbdb37b9c73555e37ff35149..9c146960b0811949fba8797ee04c393f40711733 100644 (file)
@@ -2162,7 +2162,8 @@ cp_cannot_inline_tree_fn (fnp)
       && TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn)))
     {
       fn = *fnp = instantiate_decl (fn, /*defer_ok=*/0);
-      return TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn));
+      if (TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (fn)))
+       return 1;
     }
 
   if (varargs_function_p (fn))
diff --git a/gcc/testsuite/g++.dg/opt/inline3.C b/gcc/testsuite/g++.dg/opt/inline3.C
new file mode 100644 (file)
index 0000000..7199de0
--- /dev/null
@@ -0,0 +1,40 @@
+// PR opt/6793
+// We failed to supress inlining of a varargs function when it's a template.
+// { dg-do compile }
+// { dg-options "-O3" }
+
+#include <stdarg.h>
+
+typedef __SIZE_TYPE__ size_t;
+
+template < class Type > class VectorNd
+{
+  size_t size;
+  Type *data;
+ public:
+
+  VectorNd (size_t _size, size_t count, ...)
+       : size (_size)
+  {
+    data = new Type[size];
+
+    va_list ap;
+
+    va_start (ap, count);
+
+    for (size_t i = 0; i < count; i++)
+      data[i] = va_arg (ap, Type);
+
+    va_end (ap);
+  }
+
+  ~VectorNd ()
+  {
+    delete [] data;
+  }
+};
+
+int main ()
+{
+  VectorNd <double> vector (3, 3, 1.0, 2.0, 3.0);
+}