Commit ccfbd880 by Richard Guenther Committed by Richard Biener

re PR c++/39242 (Inconsistent reject / accept of code)

2009-02-24  Richard Guenther  <rguenther@suse.de>

	PR c++/39242
	* pt.c (instantiate_decl): Do not instantiate extern, non-inline
	declared functions.

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

From-SVN: r144408
parent 844216f3
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
......
......@@ -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
......
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
......
/* 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() { };
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment