This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [Mainline regression] ICE when throwing strings
- From: Reichelt <reichelt at igpm dot rwth-aachen dot de>
- To: mark at codesourcery dot com, gcc at gcc dot gnu dot org
- Date: Fri, 25 Oct 2002 16:21:32 +0200
- Subject: Re: [Mainline regression] ICE when throwing strings
On 24 Oct, Mark Mitchell wrote:
>
>
> --On Thursday, October 24, 2002 12:23:23 PM +0200 Reichelt
> <reichelt@igpm.rwth-aachen.de> wrote:
>
>> Hi,
>>
>> we already have at least 4 PRs for this problem, so I just wanted to
>> bring it to attention in order to prevent GNATS from getting flooded with
>> more PRs of the same issue.
>>
>> Throwing an exception that uses strings will cause an ICE on
>> mainline (just compile with g++ -O):
>>
>> ----------------------snip here--------------------
>> #include<string>
>>
>> struct C
>> {
>> C (std::string) {}
>> };
>>
>> void foo ()
>> {
>> throw C(std::string());
>> }
>> ----------------------snip here--------------------
>>
>> A reduced testcase can be found in PR 8186 and PR 7959.
>> PR 8325 and PR 8244 are probably the same bug.
>
> I know exactly what is causing this; Jason wrote some code to elide
> copy constructors in this situation and it doesn't play nice with
> inlining. -fno-elide-constructors is a work-around.
>
> Jason knows about the bug and will fix it when he is no longer at the
> C++ standards meeting.
>
> If you want, test replacing "flag_elide_constructors" with "false" in
> stabilize_throw_expr; if that passes, you can go ahead and check it in
> on the mainline. That should disable the new optimization and avoid the
> bug.
The good news is that -fno-elide-constructors makes things work for all
four PRs.
The bad news is that your proposed patch, which I implemented in the
following way
----------------------------------------------------------------------
diff -up gcc/gcc/cp/except.c gcc-new/gcc/cp/except.c
--- gcc/gcc/cp/except.c Fri Oct 25 10:16:49 2002
+++ gcc-new/gcc/cp/except.c Fri Oct 25 10:16:44 2002
@@ -587,6 +587,9 @@ stabilize_throw_expr (exp, initp)
{
tree init_expr;
+#if 0
+ /* Disabled, because we get ICEs when throwing strings (see PR 8186). */
+
if (TREE_CODE (exp) == TARGET_EXPR
&& TREE_CODE (TARGET_EXPR_INITIAL (exp)) == AGGR_INIT_EXPR
&& flag_elide_constructors)
@@ -610,6 +613,7 @@ stabilize_throw_expr (exp, initp)
TREE_OPERAND (aggr_init, 1) = newargs;
}
else
+#endif
{
exp = stabilize_expr (exp, &init_expr);
}
----------------------------------------------------------------------
causes 3 regressions in the testsuite:
FAIL: g++.eh/ctor1.C referenced below (test for errors, line 4)
FAIL: g++.eh/ctor1.C can't copy (test for errors, line 12)
FAIL: g++.eh/ctor1.C (test for excess errors)
Should we prepare a patch to disable this optimization altogether
or rather wait for Jasons return?
Any thoughts?
Greetings,
Volker Reichelt