re PR c++/21627 (invalid inline warning with ctor and dtor)

PR c++/21627
	* pt.c (register_specialization): Update inline flags on clones.y
	PR c++/21627
	* g++.dg/warn/inline2.C: New test.

From-SVN: r106442
This commit is contained in:
Mark Mitchell 2005-11-03 19:45:10 +00:00 committed by Mark Mitchell
parent 98d59fe652
commit a39041fae9
4 changed files with 48 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2005-11-03 Mark Mitchell <mark@codesourcery.com>
PR c++/21627
* pt.c (register_specialization): Update inline flags on clones.y
2005-11-03 Andrew Pinski <pinskia@physics.uc.edu>
PR c++/24582

View File

@ -1179,6 +1179,7 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend)
}
else
{
tree clone;
/* This situation should occur only if the first
specialization is an implicit instantiation, the
second is an explicit specialization, and the
@ -1204,6 +1205,23 @@ register_specialization (tree spec, tree tmpl, tree args, bool is_friend)
there were no definition, and vice versa. */
DECL_INITIAL (fn) = NULL_TREE;
duplicate_decls (spec, fn, is_friend);
/* The call to duplicate_decls will have applied
[temp.expl.spec]:
An explicit specialization of a function template
is inline only if it is explicitly declared to be,
and independently of whether its function tempalte
is.
to the primary function; now copy the inline bits to
the various clones. */
FOR_EACH_CLONE (clone, fn)
{
DECL_DECLARED_INLINE_P (clone)
= DECL_DECLARED_INLINE_P (fn);
DECL_INLINE (clone)
= DECL_INLINE (fn);
}
check_specialization_namespace (fn);
return fn;

View File

@ -1,3 +1,8 @@
2005-11-03 Mark Mitchell <mark@codesourcery.com>
PR c++/21627
* g++.dg/warn/inline2.C: New test.
2005-11-03 Andrew Pinski <pinskia@physics.uc.edu>
PR middle-end/23155

View File

@ -0,0 +1,20 @@
// PR c++/21627
template<typename T>
struct TPL
{
TPL (){}
~TPL (){}
void method () {}
};
template <> TPL<int>::TPL ();
template <> TPL<int>::~TPL ();
template <> void TPL<int>::method ();
void Foo ()
{
TPL<int> i;
i.method ();
}