From fd852454b1cefd1a004cded6f5afd7332d5b6f81 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 16 Jun 2002 17:26:56 -0700 Subject: [PATCH] tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test after template instantiation. * 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 | 6 +++++ gcc/cp/tree.c | 3 ++- gcc/testsuite/g++.dg/opt/inline3.C | 40 ++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/inline3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 707ee6f04e3..4da4bd4b779 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-06-16 Richard Henderson + + PR opt/6793 + * tree.c (cp_cannot_inline_tree_fn): Don't short-circuit test + after template instantiation. + 2002-06-16 Richard Henderson * cp-tree.h, decl2.c (flag_ms_extensions): Move to c-common. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 0752d7bc8dc..9c146960b08 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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 index 00000000000..7199de09c0a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline3.C @@ -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 + +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 vector (3, 3, 1.0, 2.0, 3.0); +} -- 2.30.2