diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e1edc45cbb7e8bd2e09a00fc9306a845e03c3a51..625413b364f7cbba317346ff70503c06e0543f33 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ecfc6d1573d85a1d01a41bc692e2c108599c76b4..1efd808ff4e1577e39c05cc59411d3d7cf6351b0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9678651670f08f4ae950f0d1dd73cd70d36295b7..cec54ef070ee6f804aa7adc1b5ba9b1af46932ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/warn/inline2.C b/gcc/testsuite/g++.dg/warn/inline2.C new file mode 100644 index 0000000000000000000000000000000000000000..0f5f78af11c8bc9e8b5557c73e493819e2d79ada --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/inline2.C @@ -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 (); +} +