re PR c++/30108 (internal compiler error: in make_decl_rtl, at varasm.c:890)

PR c++/30108
	* call.c (convert_default_arg): Copy non-constant arguments.

	PR c++/30108
	* g++.dg/other/default6.C: New test.

From-SVN: r122844
This commit is contained in:
Mark Mitchell 2007-03-12 16:24:18 +00:00 committed by Mark Mitchell
parent 6d4817e374
commit 3026f2dfd9
4 changed files with 35 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2007-03-12 Mark Mitchell <mark@codesourcery.com>
PR c++/30108
* call.c (convert_default_arg): Copy non-constant arguments.
2007-03-11 Mark Mitchell <mark@codesourcery.com>
PR c++/31038

View File

@ -4664,10 +4664,14 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum)
}
else
{
/* This could get clobbered by the following call. */
if (TREE_HAS_CONSTRUCTOR (arg))
/* We must make a copy of ARG, in case subsequent processing
alters any part of it. For example, during gimplification a
cast of the form (T) &X::f (where "f" is a member function)
will lead to replacing the PTRMEM_CST for &X::f with a
VAR_DECL. We can avoid the copy for constants, since they
are never modified in place. */
if (!CONSTANT_CLASS_P (arg))
arg = copy_node (arg);
arg = convert_for_initialization (0, type, arg, LOOKUP_NORMAL,
"default argument", fn, parmnum);
arg = convert_for_arg_passing (type, arg);

View File

@ -1,3 +1,8 @@
2007-03-12 Mark Mitchell <mark@codesourcery.com>
PR c++/30108
* g++.dg/other/default6.C: New test.
2007-03-12 Richard Sandiford <richard@codesourcery.com>
* lib/target-supports.exp (check_profiling_available): Return false

View File

@ -0,0 +1,18 @@
// PR c++/30108
class BaseRobot {
typedef void (BaseRobot::*PseudoState)(void);
typedef PseudoState STATE;
STATE initial ();
int ready ();
STATE stpOtherTask ();
STATE commonEventProcessing (STATE pIdleTarget=(STATE)&BaseRobot::ready);
};
BaseRobot::STATE BaseRobot::initial ()
{
return commonEventProcessing ();
}
BaseRobot::STATE BaseRobot::stpOtherTask ()
{
return commonEventProcessing ();
}