Commit 2b0a63a3 by Mark Mitchell Committed by Mark Mitchell

decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when merging decls.

	* decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when
	merging decls.
	* pt.c (regenerate_decl_from_template): Tweak for clarity.
	(instantiate_decl): Mark a decl instantiated before regenerating
	it to avoid recursion.
	* tree.c (mapcar): Don't call decl_constant_value unless we know
	something is TREE_READONLY_DECL_P.

From-SVN: r25458
parent ed70c426
1999-02-26 Mark Mitchell <mark@markmitchell.com> 1999-02-26 Mark Mitchell <mark@markmitchell.com>
* decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when
merging decls.
* pt.c (regenerate_decl_from_template): Tweak for clarity.
(instantiate_decl): Mark a decl instantiated before regenerating
it to avoid recursion.
* tree.c (mapcar): Don't call decl_constant_value unless we know
something is TREE_READONLY_DECL_P.
* class.c (check_for_override): Don't stop checking when we find * class.c (check_for_override): Don't stop checking when we find
the first overridden function. Delete #if 0'd code. the first overridden function. Delete #if 0'd code.
* search.c (get_matching_virtual): Likewise. * search.c (get_matching_virtual): Likewise.
......
...@@ -3319,6 +3319,8 @@ duplicate_decls (newdecl, olddecl) ...@@ -3319,6 +3319,8 @@ duplicate_decls (newdecl, olddecl)
DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl); DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl);
DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl); DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl);
DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl); DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl);
DECL_TEMPLATE_INSTANTIATED (newdecl)
|= DECL_TEMPLATE_INSTANTIATED (olddecl);
/* Don't really know how much of the language-specific /* Don't really know how much of the language-specific
values we should copy from old to new. */ values we should copy from old to new. */
DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl); DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl);
......
...@@ -9053,8 +9053,7 @@ regenerate_decl_from_template (decl, tmpl) ...@@ -9053,8 +9053,7 @@ regenerate_decl_from_template (decl, tmpl)
/* Pop the class context we pushed above. */ /* Pop the class context we pushed above. */
popclass (1); popclass (1);
} }
else if (TREE_CODE (decl) == FUNCTION_DECL)
if (TREE_CODE (decl) == FUNCTION_DECL)
{ {
/* Convince duplicate_decls to use the DECL_ARGUMENTS from the /* Convince duplicate_decls to use the DECL_ARGUMENTS from the
new decl. */ new decl. */
...@@ -9249,9 +9248,15 @@ instantiate_decl (d) ...@@ -9249,9 +9248,15 @@ instantiate_decl (d)
goto out; goto out;
} }
regenerate_decl_from_template (d, td); /* We're now committed to instantiating this template. Mark it as
instantiated so that recursive calls to instantiate_decl do not
try to instantiate it again. */
DECL_TEMPLATE_INSTANTIATED (d) = 1; DECL_TEMPLATE_INSTANTIATED (d) = 1;
/* Regenerate the declaration in case the template has been modified
by a subsequent redeclaration. */
regenerate_decl_from_template (d, td);
/* We already set the file and line above. Reset them now in case /* We already set the file and line above. Reset them now in case
they changed as a result of calling regenerate_decl_from_template. */ they changed as a result of calling regenerate_decl_from_template. */
lineno = DECL_SOURCE_LINE (d); lineno = DECL_SOURCE_LINE (d);
......
...@@ -1846,11 +1846,13 @@ mapcar (t, func) ...@@ -1846,11 +1846,13 @@ mapcar (t, func)
void g() { const int i = 7; f<i>(7); } void g() { const int i = 7; f<i>(7); }
however, we must actually return the constant initializer. */ however, we must actually return the constant initializer. */
tmp = decl_constant_value (t); if (TREE_READONLY_DECL_P (t))
if (tmp != t) {
return mapcar (tmp, func); tmp = decl_constant_value (t);
else if (tmp != t)
return error_mark_node; return mapcar (tmp, func);
}
return error_mark_node;
case PARM_DECL: case PARM_DECL:
{ {
......
// Build don't link:
// Origin: Steven Parkes <parkes@sierravista.com>
typedef unsigned int size_t;
class UUId {};
template <class T> class MetaClass;
class TypeInfo;
struct MetaClassGeneric
{
MetaClassGeneric( TypeInfo& );
};
struct TypeInfo
{
void (*constructor)( void* );
void initialize( void* );
};
template <class T>
class TypeIDInit {
public:
TypeIDInit();
static void initialize();
static TypeInfo info;
static int storage[];
static void metaclassConstructor( void* );
};
template <class T>
TypeInfo TypeIDInit<T>::info =
{
TypeIDInit<T>::metaclassConstructor
};
template <class T>
inline
TypeIDInit<T>::TypeIDInit()
{
info.initialize(storage);
}
template <class T>
class NameInfo : public MetaClassGeneric {
public:
NameInfo()
: MetaClassGeneric( TypeIDInit<T>::info ) {}
};
class MetaClass<UUId>
: public NameInfo<UUId>
{
};
extern "C++"
inline void *operator new(size_t, void *place) throw() { return place; }
template <class T>
void
TypeIDInit<T>::metaclassConstructor( void* place )
{
new ( place ) MetaClass<T>;
}
template class TypeIDInit<UUId> ;
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