Commit 5275f2bf by Jason Merrill Committed by Jason Merrill

re PR c++/8080 ([Regression in main trunk] g++ 3.3 ICE in make_decl_rtl)

        PR c++/8080
        * semantics.c (finish_for_cond, finish_while_stmt_cond): Don't mess
        with condition decls in a template.

From-SVN: r58282
parent 8a188e24
2002-10-18 Jason Merrill <jason@redhat.com>
PR c++/8080
* semantics.c (finish_for_cond, finish_while_cond): Don't mess
with condition decls in a template.
2002-10-17 Nathan Sidwell <nathan@codesourcery.com> 2002-10-17 Nathan Sidwell <nathan@codesourcery.com>
* class.c (add_method): Compare template parms too. * class.c (add_method): Compare template parms too.
......
...@@ -317,7 +317,10 @@ finish_while_stmt_cond (cond, while_stmt) ...@@ -317,7 +317,10 @@ finish_while_stmt_cond (cond, while_stmt)
tree while_stmt; tree while_stmt;
{ {
cond = maybe_convert_cond (cond); cond = maybe_convert_cond (cond);
if (getdecls () == NULL_TREE) if (processing_template_decl)
/* Don't mess with condition decls in a template. */
FINISH_COND (cond, while_stmt, WHILE_COND (while_stmt));
else if (getdecls () == NULL_TREE)
/* It was a simple condition; install it. */ /* It was a simple condition; install it. */
WHILE_COND (while_stmt) = cond; WHILE_COND (while_stmt) = cond;
else else
...@@ -452,7 +455,10 @@ finish_for_cond (cond, for_stmt) ...@@ -452,7 +455,10 @@ finish_for_cond (cond, for_stmt)
tree for_stmt; tree for_stmt;
{ {
cond = maybe_convert_cond (cond); cond = maybe_convert_cond (cond);
if (getdecls () == NULL_TREE) if (processing_template_decl)
/* Don't mess with condition decls in a template. */
FINISH_COND (cond, for_stmt, FOR_COND (for_stmt));
else if (getdecls () == NULL_TREE)
/* It was a simple condition; install it. */ /* It was a simple condition; install it. */
FOR_COND (for_stmt) = cond; FOR_COND (for_stmt) = cond;
else else
......
// PR c++/8080
// Bug: the transformation in finish_while_stmt_cond produced something
// that tsubst_expr handled badly. Fixed by not doing the transformation
// while parsing a template.
class TObject {};
struct TIter {
TObject *operator()();
};
template<class T>
void get_root_object(TIter& iobj) {
while ( TObject* pnew_obj = iobj() )
;
}
void foo(TIter& iobj)
{
get_root_object<int>(iobj);
}
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