OSDN Git Service

PR c++/8080
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Oct 2002 09:00:47 +0000 (09:00 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Oct 2002 09:00:47 +0000 (09:00 +0000)
        * semantics.c (finish_for_cond, finish_while_stmt_cond): Don't mess
        with condition decls in a template.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58282 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/g++.dg/template/cond.C [new file with mode: 0644]

index e2a0976..bdceab0 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        * class.c (add_method): Compare template parms too.
index 27fa97a..c561a66 100644 (file)
@@ -317,7 +317,10 @@ finish_while_stmt_cond (cond, while_stmt)
      tree while_stmt;
 {
   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.  */
     WHILE_COND (while_stmt) = cond;
   else
@@ -452,7 +455,10 @@ finish_for_cond (cond, for_stmt)
      tree for_stmt;
 {
   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.  */
     FOR_COND (for_stmt) = cond;
   else
diff --git a/gcc/testsuite/g++.dg/template/cond.C b/gcc/testsuite/g++.dg/template/cond.C
new file mode 100644 (file)
index 0000000..394a21c
--- /dev/null
@@ -0,0 +1,23 @@
+// 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);
+}