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 ();
+}
+