re PR c++/21627 (invalid inline warning with ctor and dtor)
authorMark Mitchell <mark@codesourcery.com>
Thu, 3 Nov 2005 19:45:10 +0000 (19:45 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 3 Nov 2005 19:45:10 +0000 (19:45 +0000)
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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/inline2.C [new file with mode: 0644]

index e1edc45..625413b 100644 (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
index ecfc6d1..1efd808 100644 (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;
index 9678651..cec54ef 100644 (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 
diff --git a/gcc/testsuite/g++.dg/warn/inline2.C b/gcc/testsuite/g++.dg/warn/inline2.C
new file mode 100644 (file)
index 0000000..0f5f78a
--- /dev/null
@@ -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 ();
+}
+