calls.c (precompute_arguments): Fix typo in comment.
authorMark Mitchell <mark@codesourcery.com>
Wed, 15 Sep 1999 17:21:35 +0000 (17:21 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 15 Sep 1999 17:21:35 +0000 (17:21 +0000)
* calls.c (precompute_arguments): Fix typo in comment.
* expr.c (preexpand_calls): Don't preexpand the cleanup in a
TARGET_EXPR.

From-SVN: r29438

gcc/ChangeLog
gcc/calls.c
gcc/expr.c
gcc/testsuite/g++.old-deja/g++.other/crash10.C [new file with mode: 0644]

index 5d85a313e94ebdb6a9d196c9519a9d7251a51f06..da8c5cb196bf285e244f17a13aedc8a7d7e57813 100644 (file)
@@ -1,3 +1,9 @@
+Wed Sep 15 10:25:12 1999  Mark Mitchell  <mark@codesourcery.com>
+
+       * calls.c (precompute_arguments): Fix typo in comment.
+       * expr.c (preexpand_calls): Don't preexpand the cleanup in a
+       TARGET_EXPR.
+
 Wed Sep 15 09:59:59 1999  Mark Mitchell  <mark@codesourcery.com>
 
        * dsp16xx.c (override_options): Fix typos in GC root registration.
index bc1e2a7b89525c8f8039994091fb24111acb6d1e..6a36ef01c6e110a6bbfb75cb4f4f6046e612de5d 100644 (file)
@@ -1199,7 +1199,7 @@ compute_argument_block_size (reg_parm_stack_space, args_size)
   return unadjusted_args_size;
 }
 
-/* Precompute parameters has needed for a function call.
+/* Precompute parameters as needed for a function call.
 
    IS_CONST indicates the target function is a pure function.
 
index c4d0f143fe823ace687e800b8888097df26295c2..c51a97a93f42628fa1475e08f52db26c0252fcf0 100644 (file)
@@ -8542,10 +8542,17 @@ preexpand_calls (exp)
   for (i = 0; i < nops; i++)
     if (TREE_OPERAND (exp, i) != 0)
       {
-       type = TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, i)));
-       if (type == 'e' || type == '<' || type == '1' || type == '2'
-           || type == 'r')
-         preexpand_calls (TREE_OPERAND (exp, i));
+       if (TREE_CODE (exp) == TARGET_EXPR && i == 2)
+         /* We don't need to preexpand the cleanup for a TARGET_EXPR.
+            It doesn't happen before the call is made.  */
+         ;
+       else
+         {
+           type = TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, i)));
+           if (type == 'e' || type == '<' || type == '1' || type == '2'
+               || type == 'r')
+             preexpand_calls (TREE_OPERAND (exp, i));
+         }
       }
 }
 \f
diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash10.C b/gcc/testsuite/g++.old-deja/g++.other/crash10.C
new file mode 100644 (file)
index 0000000..3168f3f
--- /dev/null
@@ -0,0 +1,52 @@
+// Build don't link:
+// Origin: Loring Holden <lsh@cs.brown.edu>
+
+template <class T>
+class REFptr {
+   public:
+      REFptr();
+      REFptr(T *pObj);
+      virtual ~REFptr();
+      operator T* () const;
+};
+
+class GEL;
+class GELsubc {
+   public :
+      virtual GEL *GELcast() const;
+};
+class GELptr : public REFptr<GEL>{
+   public :                                        
+      GELptr(const GELptr  &p);
+      GELptr(const GELsubc &p);
+};
+class GEL { };
+
+class GEOM;
+class GEOMptr : public REFptr<GEOM>, public GELsubc {
+   public:
+      GEOMptr() { }
+      GEOMptr(GEOM  *g); 
+};
+class GEOM : public GEL {
+   public: 
+      GEOM(const GEOMptr &o);
+      GEOM();
+};
+
+class TEXT2D;
+class TEXT2Dptr : public REFptr<TEXT2D> {
+   public:
+      TEXT2Dptr();
+      TEXT2Dptr(TEXT2D *g); 
+};
+class TEXT2D : public GEOM { };
+
+void testit(const GELptr g);
+
+void
+FPS()
+{
+  TEXT2Dptr fps_text;
+  testit(GEOMptr(&*fps_text));
+}