re PR c++/10506 (ICE in build_new at cp/init.c with -fkeep-inline-functions and multiple inheritance)

PR c++/10506
	* method.c (use_thunk): Decrement immediate_size_expand.

	PR c++/10503
	* cp-tree.h (DECL_VAR_MARKED_P): New macro.
	(DECL_MAYBE_TEMPLATE): Remove.
	* class.c (fixed_type_or_null): Avoid infinite recursion.

	PR c++/10506
	* g++.dg/init/new6.C: New test.

	PR c++/10503
	* g++.dg/init/ref6.C: New test.

From-SVN: r66150
This commit is contained in:
Mark Mitchell 2003-04-28 06:06:59 +00:00 committed by Mark Mitchell
parent aa438e8f2b
commit 772f8889ca
7 changed files with 61 additions and 9 deletions

View File

@ -1,5 +1,13 @@
2003-04-27 Mark Mitchell <mark@codesourcery.com>
PR c++/10506
* method.c (use_thunk): Decrement immediate_size_expand.
PR c++/10503
* cp-tree.h (DECL_VAR_MARKED_P): New macro.
(DECL_MAYBE_TEMPLATE): Remove.
* class.c (fixed_type_or_null): Avoid infinite recursion.
* decl.c (maybe_commonize_var): Make the code match the comments.
* pt.c (instantiate_decl): Move call to import_export_decl.

View File

@ -5388,11 +5388,21 @@ fixed_type_or_null (tree instance, int* nonnull, int* cdtorp)
/* Reference variables should be references to objects. */
if (nonnull)
*nonnull = 1;
if (TREE_CODE (instance) == VAR_DECL
&& DECL_INITIAL (instance))
return fixed_type_or_null (DECL_INITIAL (instance),
nonnull, cdtorp);
/* DECL_VAR_MARKED_P is used to prevent recursion; a
variable's initializer may refer to the variable
itself. */
if (TREE_CODE (instance) == VAR_DECL
&& DECL_INITIAL (instance)
&& !DECL_VAR_MARKED_P (instance))
{
tree type;
DECL_VAR_MARKED_P (instance) = 1;
type = fixed_type_or_null (DECL_INITIAL (instance),
nonnull, cdtorp);
DECL_VAR_MARKED_P (instance) = 0;
return type;
}
}
return NULL_TREE;

View File

@ -95,7 +95,7 @@ struct diagnostic_context;
DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
3: DECL_IN_AGGR_P.
4: DECL_C_BIT_FIELD (in a FIELD_DECL)
DECL_MAYBE_TEMPLATE (in a FUNCTION_DECL)
DECL_VAR_MARKED_P (in a VAR_DECL)
5: DECL_INTERFACE_KNOWN.
6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
@ -2131,6 +2131,12 @@ struct lang_decl GTY(())
(DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
->decl_flags.u.template_info)
/* For a VAR_DECL, indicates that the variable has been processed.
This flag is set and unset throughout the code; it is always
used for a temporary purpose. */
#define DECL_VAR_MARKED_P(NODE) \
(DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)))
/* Template information for a RECORD_TYPE or UNION_TYPE. */
#define CLASSTYPE_TEMPLATE_INFO(NODE) \
(LANG_TYPE_CLASS_CHECK (RECORD_OR_UNION_TYPE_CHECK (NODE))->template_info)
@ -2807,9 +2813,6 @@ struct lang_decl GTY(())
#define PROCESSING_REAL_TEMPLATE_DECL_P() \
(processing_template_decl > template_class_depth (current_class_type))
/* This function may be a guiding decl for a template. */
#define DECL_MAYBE_TEMPLATE(NODE) DECL_LANG_FLAG_4 (NODE)
/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been
instantiated, i.e. its definition has been generated from the
pattern given in the the template. */

View File

@ -439,6 +439,9 @@ use_thunk (tree thunk_fndecl, bool emit_p)
assemble_end_function (thunk_fndecl, fnname);
current_function_decl = 0;
cfun = 0;
/* Because init_function_start increments this, we must
decrement it. */
immediate_size_expand--;
TREE_ASM_WRITTEN (thunk_fndecl) = 1;
}
else

View File

@ -1,3 +1,11 @@
2003-04-27 Mark Mitchell <mark@codesourcery.com>
PR c++/10506
* g++.dg/init/new6.C: New test.
PR c++/10503
* g++.dg/init/ref6.C: New test.
2003-04-26 David Edelsohn <edelsohn@gnu.org>
* g++.dg/warn/weak1.C: XFAIL on AIX4.

View File

@ -0,0 +1,8 @@
// { dg-options "-fkeep-inline-functions" }
struct B1 { virtual ~B1(); };
struct B2 { virtual ~B2(); };
struct D : B1, B2 {};
struct X : D { X (); };
X::X () { new int; }

View File

@ -0,0 +1,12 @@
struct B {
void g() { }
};
struct A {
void f() {
B &b = b;
b.g();
}
};
int main(void) { }