OSDN Git Service

2009-02-24 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Feb 2009 14:50:30 +0000 (14:50 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 24 Feb 2009 14:50:30 +0000 (14:50 +0000)
PR c++/39242
* pt.c (instantiate_decl): Do not instantiate extern, non-inline
declared functions.

* g++.dg/template/instantiate10.C: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144408 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 0af1372..139abc6 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-24  Richard Guenther  <rguenther@suse.de>
+
+       PR c++/39242
+       * pt.c (instantiate_decl): Do not instantiate extern, non-inline
+       declared functions.
+
 2009-02-23  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR c++/36411
index bef6002..dacc868 100644 (file)
@@ -15295,9 +15295,14 @@ instantiate_decl (tree d, int defer_ok,
   /* In general, we do not instantiate such templates...  */
   if (external_p
       /* ... but we instantiate inline functions so that we can inline
-        them and ... */
+        them.  An explicit instantiation declaration prohibits implicit
+        instantiation of non-inline functions.  With high levels of
+        optimization, we would normally inline non-inline functions
+        -- but we're not allowed to do that for "extern template" functions.
+        Therefore, we check DECL_DECLARED_INLINE_P, rather than
+        possibly_inlined_p.  And ...  */
       && ! (TREE_CODE (d) == FUNCTION_DECL
-           && possibly_inlined_p (d))
+           && DECL_DECLARED_INLINE_P (d))
       /* ... we instantiate static data members whose values are
         needed in integral constant expressions.  */
       && ! (TREE_CODE (d) == VAR_DECL
index 4af6e18..00a2ce9 100644 (file)
@@ -1,4 +1,9 @@
 2009-02-24  Richard Guenther  <rguenther@suse.de>
+
+       PR c++/39242
+       * g++.dg/template/instantiate10.C: New testcase.
+
+2009-02-24  Richard Guenther  <rguenther@suse.de>
        Zdenek Dvorak  <ook@ucw.cz>
 
        PR tree-optimization/39233
diff --git a/gcc/testsuite/g++.dg/template/instantiate10.C b/gcc/testsuite/g++.dg/template/instantiate10.C
new file mode 100644 (file)
index 0000000..678e019
--- /dev/null
@@ -0,0 +1,37 @@
+/* PR c++/39242, xplicit instantiation declaration prohibits implicit
+   instantiation of non-inline functions.  */
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+class Rep {
+public:
+    void unref() const { }
+    static void unref (const Rep * obj_r) { obj_r->unref(); }
+};
+template<typename _Tp, typename _Bt = _Tp>
+class RepPtrStore {
+    _Tp * _obj;
+    void _assign( _Tp * new_r );
+public:
+    ~RepPtrStore() { _assign( 0 ); }
+};
+template<typename _Tp,typename _Bt>
+void RepPtrStore<_Tp,_Bt>::_assign( _Tp * new_r )
+{
+  Rep::unref( _obj );
+}
+class RepPtrBase { };
+template<typename _Bt> class PtrBase : public RepPtrBase { };
+template<typename _Tp, typename _Bt = _Tp>
+class Ptr : public PtrBase<_Bt> {
+    RepPtrStore<_Tp,_Bt> _ptr;
+};
+class YCode;
+class YStatement;
+typedef Ptr<YStatement,YCode> YStatementPtr;
+extern template class RepPtrStore<YStatement,YCode>;
+class ExecutionEnvironment {
+    YStatementPtr m_statement;
+    ~ExecutionEnvironment() { };
+};
+