patches/gdb/6.3/700-debian_cp-pass-by-reference.patch
changeset 330 447b203edc2e
parent 329 419d959441ed
child 331 0c05f9ea3254
     1.1 --- a/patches/gdb/6.3/700-debian_cp-pass-by-reference.patch	Tue Aug 14 19:32:22 2007 +0000
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,464 +0,0 @@
     1.4 -This patch needs to be submitted for the FSF.  Also, there may be testcases
     1.5 -already in the GDB testsuite (currently disabled) that it would probably fix.
     1.6 -
     1.7 -Index: gdb-6.3/gdb/infcall.c
     1.8 -===================================================================
     1.9 ---- gdb-6.3.orig/gdb/infcall.c	2004-10-08 04:15:56.000000000 -0400
    1.10 -+++ gdb-6.3/gdb/infcall.c	2004-11-10 12:30:07.000000000 -0500
    1.11 -@@ -36,6 +36,7 @@
    1.12 - #include "gdb_string.h"
    1.13 - #include "infcall.h"
    1.14 - #include "dummy-frame.h"
    1.15 -+#include "cp-abi.h"
    1.16 - 
    1.17 - /* NOTE: cagney/2003-04-16: What's the future of this code?
    1.18 - 
    1.19 -@@ -297,8 +298,8 @@ call_function_by_hand (struct value *fun
    1.20 - {
    1.21 -   CORE_ADDR sp;
    1.22 -   CORE_ADDR dummy_addr;
    1.23 --  struct type *value_type;
    1.24 --  unsigned char struct_return;
    1.25 -+  struct type *value_type, *target_value_type;
    1.26 -+  unsigned char struct_return = 0, cp_struct_return = 0;
    1.27 -   CORE_ADDR struct_addr = 0;
    1.28 -   struct regcache *retbuf;
    1.29 -   struct cleanup *retbuf_cleanup;
    1.30 -@@ -312,6 +313,7 @@ call_function_by_hand (struct value *fun
    1.31 -   struct regcache *caller_regcache;
    1.32 -   struct cleanup *caller_regcache_cleanup;
    1.33 -   struct frame_id dummy_id;
    1.34 -+  struct cleanup *args_cleanup;
    1.35 - 
    1.36 -   if (!target_has_execution)
    1.37 -     noprocess ();
    1.38 -@@ -410,10 +412,31 @@ call_function_by_hand (struct value *fun
    1.39 -     using_gcc = (b == NULL ? 2 : BLOCK_GCC_COMPILED (b));
    1.40 -   }
    1.41 - 
    1.42 --  /* Are we returning a value using a structure return or a normal
    1.43 --     value return? */
    1.44 -+  /* Are we returning a value using a structure return (passing a
    1.45 -+     hidden argument pointing to storage) or a normal value return?
    1.46 -+     There are two cases: C++ ABI mandated structure return and
    1.47 -+     target ABI structure return.  The variable STRUCT_RETURN only
    1.48 -+     describes the latter.  The C++ version is handled by passing
    1.49 -+     the return location as the first parameter to the function,
    1.50 -+     even preceding "this".  This is different from the target
    1.51 -+     ABI version, which is target-specific; for instance, on ia64
    1.52 -+     the first argument is passed in out0 but the hidden structure
    1.53 -+     return pointer would normally be passed in r8.  */
    1.54 - 
    1.55 --  struct_return = using_struct_return (value_type, using_gcc);
    1.56 -+  if (current_language->la_language == language_cplus
    1.57 -+      && cp_pass_by_reference (value_type))
    1.58 -+    {
    1.59 -+      cp_struct_return = 1;
    1.60 -+
    1.61 -+      /* Tell the target specific argument pushing routine not to
    1.62 -+	 expect a value.  */
    1.63 -+      target_value_type = builtin_type_void;
    1.64 -+    }
    1.65 -+  else
    1.66 -+    {
    1.67 -+      struct_return = using_struct_return (value_type, using_gcc);
    1.68 -+      target_value_type = value_type;
    1.69 -+    }
    1.70 - 
    1.71 -   /* Determine the location of the breakpoint (and possibly other
    1.72 -      stuff) that the called function will return to.  The SPARC, for a
    1.73 -@@ -432,7 +455,7 @@ call_function_by_hand (struct value *fun
    1.74 -       if (INNER_THAN (1, 2))
    1.75 - 	{
    1.76 - 	  sp = push_dummy_code (current_gdbarch, sp, funaddr,
    1.77 --				using_gcc, args, nargs, value_type,
    1.78 -+				using_gcc, args, nargs, target_value_type,
    1.79 - 				&real_pc, &bp_addr);
    1.80 - 	  dummy_addr = sp;
    1.81 - 	}
    1.82 -@@ -440,7 +463,7 @@ call_function_by_hand (struct value *fun
    1.83 - 	{
    1.84 - 	  dummy_addr = sp;
    1.85 - 	  sp = push_dummy_code (current_gdbarch, sp, funaddr,
    1.86 --				using_gcc, args, nargs, value_type,
    1.87 -+				using_gcc, args, nargs, target_value_type,
    1.88 - 				&real_pc, &bp_addr);
    1.89 - 	}
    1.90 -       break;
    1.91 -@@ -507,9 +530,15 @@ call_function_by_hand (struct value *fun
    1.92 - 	  param_type = TYPE_FIELD_TYPE (ftype, i);
    1.93 - 	else
    1.94 - 	  param_type = NULL;
    1.95 --	
    1.96 -+
    1.97 - 	args[i] = value_arg_coerce (args[i], param_type, prototyped);
    1.98 - 
    1.99 -+	/* FIXME: Is current_language the right language?  */
   1.100 -+	if (current_language->la_language == language_cplus
   1.101 -+	    && param_type != NULL
   1.102 -+	    && cp_pass_by_reference (param_type))
   1.103 -+	  args[i] = value_addr (args[i]);
   1.104 -+
   1.105 - 	/* elz: this code is to handle the case in which the function
   1.106 - 	   to be called has a pointer to function as parameter and the
   1.107 - 	   corresponding actual argument is the address of a function
   1.108 -@@ -607,7 +636,7 @@ You must use a pointer to function type 
   1.109 -      stack, if necessary.  Make certain that the value is correctly
   1.110 -      aligned. */
   1.111 - 
   1.112 --  if (struct_return)
   1.113 -+  if (struct_return || cp_struct_return)
   1.114 -     {
   1.115 -       int len = TYPE_LENGTH (value_type);
   1.116 -       if (INNER_THAN (1, 2))
   1.117 -@@ -632,6 +661,22 @@ You must use a pointer to function type 
   1.118 - 	}
   1.119 -     }
   1.120 - 
   1.121 -+  if (cp_struct_return)
   1.122 -+    {
   1.123 -+      struct value **new_args;
   1.124 -+
   1.125 -+      /* Add the new argument to the front of the argument list.  */
   1.126 -+      new_args = xmalloc (sizeof (struct value *) * (nargs + 1));
   1.127 -+      new_args[0] = value_from_pointer (lookup_pointer_type (value_type),
   1.128 -+					struct_addr);
   1.129 -+      memcpy (&new_args[1], &args[0], sizeof (struct value *) * nargs);
   1.130 -+      args = new_args;
   1.131 -+      nargs++;
   1.132 -+      args_cleanup = make_cleanup (xfree, args);
   1.133 -+    }
   1.134 -+  else
   1.135 -+    args_cleanup = make_cleanup (null_cleanup, NULL);
   1.136 -+
   1.137 -   /* Create the dummy stack frame.  Pass in the call dummy address as,
   1.138 -      presumably, the ABI code knows where, in the call dummy, the
   1.139 -      return address should be pointed.  */
   1.140 -@@ -649,6 +694,8 @@ You must use a pointer to function type 
   1.141 -   else
   1.142 -     error ("This target does not support function calls");
   1.143 - 
   1.144 -+  do_cleanups (args_cleanup);
   1.145 -+
   1.146 -   /* Set up a frame ID for the dummy frame so we can pass it to
   1.147 -      set_momentary_breakpoint.  We need to give the breakpoint a frame
   1.148 -      ID so that the breakpoint code can correctly re-identify the
   1.149 -@@ -839,11 +886,7 @@ the function call).", name);
   1.150 -   /* Figure out the value returned by the function, return that.  */
   1.151 -   {
   1.152 -     struct value *retval;
   1.153 --    if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
   1.154 --      /* If the function returns void, don't bother fetching the
   1.155 --	 return value.  */
   1.156 --      retval = allocate_value (value_type);
   1.157 --    else if (struct_return)
   1.158 -+    if (struct_return || cp_struct_return)
   1.159 -       /* NOTE: cagney/2003-09-27: This assumes that PUSH_DUMMY_CALL
   1.160 - 	 has correctly stored STRUCT_ADDR in the target.  In the past
   1.161 - 	 that hasn't been the case, the old MIPS PUSH_ARGUMENTS
   1.162 -@@ -853,6 +896,10 @@ the function call).", name);
   1.163 - 	 "struct return convention", check that PUSH_DUMMY_CALL isn't
   1.164 - 	 playing tricks.  */
   1.165 -       retval = value_at (value_type, struct_addr, NULL);
   1.166 -+    else if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
   1.167 -+      /* If the function returns void, don't bother fetching the
   1.168 -+	 return value.  */
   1.169 -+      retval = allocate_value (value_type);
   1.170 -     else
   1.171 -       {
   1.172 - 	/* This code only handles "register convention".  */
   1.173 -Index: gdb-6.3/gdb/cp-abi.h
   1.174 -===================================================================
   1.175 ---- gdb-6.3.orig/gdb/cp-abi.h	2003-04-12 13:41:25.000000000 -0400
   1.176 -+++ gdb-6.3/gdb/cp-abi.h	2004-11-10 12:30:07.000000000 -0500
   1.177 -@@ -1,7 +1,7 @@
   1.178 - /* Abstraction of various C++ ABI's we support, and the info we need
   1.179 -    to get from them.
   1.180 -    Contributed by Daniel Berlin <dberlin@redhat.com>
   1.181 --   Copyright 2001 Free Software Foundation, Inc.
   1.182 -+   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
   1.183 - 
   1.184 -    This file is part of GDB.
   1.185 - 
   1.186 -@@ -145,6 +145,10 @@ extern struct type *value_rtti_type (str
   1.187 - extern int baseclass_offset (struct type *type, int index, char *valaddr,
   1.188 - 			     CORE_ADDR address);
   1.189 -                   
   1.190 -+/* Return non-zero if an argument of type TYPE should be passed by reference
   1.191 -+   instead of value.  */
   1.192 -+extern int cp_pass_by_reference (struct type *type);
   1.193 -+
   1.194 - struct cp_abi_ops
   1.195 - {
   1.196 -   const char *shortname;
   1.197 -@@ -162,6 +166,7 @@ struct cp_abi_ops
   1.198 - 			     int *using_enc);
   1.199 -   int (*baseclass_offset) (struct type *type, int index, char *valaddr,
   1.200 - 			   CORE_ADDR address);
   1.201 -+  int (*pass_by_reference) (struct type *type);
   1.202 - };
   1.203 - 
   1.204 - 
   1.205 -Index: gdb-6.3/gdb/cp-abi.c
   1.206 -===================================================================
   1.207 ---- gdb-6.3.orig/gdb/cp-abi.c	2003-11-26 17:04:00.000000000 -0500
   1.208 -+++ gdb-6.3/gdb/cp-abi.c	2004-11-10 12:30:07.000000000 -0500
   1.209 -@@ -1,5 +1,5 @@
   1.210 - /* Generic code for supporting multiple C++ ABI's
   1.211 --   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
   1.212 -+   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
   1.213 - 
   1.214 -    This file is part of GDB.
   1.215 - 
   1.216 -@@ -94,6 +94,14 @@ value_rtti_type (struct value *v, int *f
   1.217 -   return (*current_cp_abi.rtti_type) (v, full, top, using_enc);
   1.218 - }
   1.219 - 
   1.220 -+int
   1.221 -+cp_pass_by_reference (struct type *type)
   1.222 -+{
   1.223 -+  if ((current_cp_abi.pass_by_reference) == NULL)
   1.224 -+    return 0;
   1.225 -+  return (*current_cp_abi.pass_by_reference) (type);
   1.226 -+}
   1.227 -+
   1.228 - /* Set the current C++ ABI to SHORT_NAME.  */
   1.229 - 
   1.230 - static int
   1.231 -Index: gdb-6.3/gdb/gnu-v3-abi.c
   1.232 -===================================================================
   1.233 ---- gdb-6.3.orig/gdb/gnu-v3-abi.c	2004-03-15 15:38:08.000000000 -0500
   1.234 -+++ gdb-6.3/gdb/gnu-v3-abi.c	2004-11-10 12:30:07.000000000 -0500
   1.235 -@@ -1,7 +1,7 @@
   1.236 - /* Abstraction of GNU v3 abi.
   1.237 -    Contributed by Jim Blandy <jimb@redhat.com>
   1.238 - 
   1.239 --   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
   1.240 -+   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
   1.241 - 
   1.242 -    This file is part of GDB.
   1.243 - 
   1.244 -@@ -419,6 +419,84 @@ gnuv3_baseclass_offset (struct type *typ
   1.245 -   return base_offset;
   1.246 - }
   1.247 - 
   1.248 -+/* Return nonzero if a type should be passed by reference.
   1.249 -+
   1.250 -+   The rule in the v3 ABI document comes from section 3.1.1.  If the
   1.251 -+   type has a non-trivial copy constructor or destructor, then the
   1.252 -+   caller must make a copy (by calling the copy constructor if there
   1.253 -+   is one or perform the copy itself otherwise), pass the address of
   1.254 -+   the copy, and then destroy the temporary (if necessary).
   1.255 -+
   1.256 -+   For return values with non-trivial copy constructors or
   1.257 -+   destructors, space will be allocated in the caller, and a pointer
   1.258 -+   will be passed as the first argument (preceding "this").
   1.259 -+
   1.260 -+   We don't have a bulletproof mechanism for determining whether a
   1.261 -+   constructor or destructor is trivial.  For GCC and DWARF2 debug
   1.262 -+   information, we can check the artificial flag.
   1.263 -+
   1.264 -+   We don't do anything with the constructors or destructors yet,
   1.265 -+   but we have to get the argument passing right anyway.  */
   1.266 -+static int
   1.267 -+gnuv3_pass_by_reference (struct type *type)
   1.268 -+{
   1.269 -+  int fieldnum, fieldelem, basenum;
   1.270 -+
   1.271 -+  CHECK_TYPEDEF (type);
   1.272 -+
   1.273 -+  /* We're only interested in things that can have methods.  */
   1.274 -+  if (TYPE_CODE (type) != TYPE_CODE_STRUCT
   1.275 -+      && TYPE_CODE (type) != TYPE_CODE_CLASS
   1.276 -+      && TYPE_CODE (type) != TYPE_CODE_UNION)
   1.277 -+    return 0;
   1.278 -+
   1.279 -+  for (fieldnum = 0; fieldnum < TYPE_NFN_FIELDS (type); fieldnum++)
   1.280 -+    for (fieldelem = 0; fieldelem < TYPE_FN_FIELDLIST_LENGTH (type, fieldnum);
   1.281 -+	 fieldelem++)
   1.282 -+      {
   1.283 -+	struct fn_field *fn = TYPE_FN_FIELDLIST1 (type, fieldnum);
   1.284 -+	char *name = TYPE_FN_FIELDLIST_NAME (type, fieldnum);
   1.285 -+	struct type *fieldtype = TYPE_FN_FIELD_TYPE (fn, fieldelem);
   1.286 -+
   1.287 -+	/* If this function is marked as artificial, it is compiler-generated,
   1.288 -+	   and we assume it is trivial.  */
   1.289 -+	if (TYPE_FN_FIELD_ARTIFICIAL (fn, fieldelem))
   1.290 -+	  continue;
   1.291 -+
   1.292 -+	/* If we've found a destructor, we must pass this by reference.  */
   1.293 -+	if (name[0] == '~')
   1.294 -+	  return 1;
   1.295 -+
   1.296 -+	/* If the mangled name of this method doesn't indicate that it
   1.297 -+	   is a constructor, we're not interested.
   1.298 -+
   1.299 -+	   FIXME drow/2004-05-27: We could do this using the name of
   1.300 -+	   the method and the name of the class instead of dealing
   1.301 -+	   with the mangled name.  We don't have a convenient function
   1.302 -+	   to strip off both leading scope qualifiers and trailing
   1.303 -+	   template arguments yet.  */
   1.304 -+	if (!is_constructor_name (TYPE_FN_FIELD_PHYSNAME (fn, fieldelem)))
   1.305 -+	  continue;
   1.306 -+
   1.307 -+	/* If this method takes two arguments, and the second argument is
   1.308 -+	   a reference to this class, then it is a copy constructor.  */
   1.309 -+	if (TYPE_NFIELDS (fieldtype) == 2
   1.310 -+	    && TYPE_CODE (TYPE_FIELD_TYPE (fieldtype, 1)) == TYPE_CODE_REF
   1.311 -+	    && check_typedef (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (fieldtype, 1))) == type)
   1.312 -+	  return 1;
   1.313 -+      }
   1.314 -+
   1.315 -+  /* Even if all the constructors and destructors were artificial, one
   1.316 -+     of them may have invoked a non-artificial constructor or
   1.317 -+     destructor in a base class.  If any base class needs to be passed
   1.318 -+     by reference, so does this class.  */
   1.319 -+  for (basenum = 0; basenum < TYPE_N_BASECLASSES (type); basenum++)
   1.320 -+    if (gnuv3_pass_by_reference (TYPE_BASECLASS (type, basenum)))
   1.321 -+      return 1;
   1.322 -+
   1.323 -+  return 0;
   1.324 -+}
   1.325 -+
   1.326 - static void
   1.327 - init_gnuv3_ops (void)
   1.328 - {
   1.329 -@@ -434,6 +512,7 @@ init_gnuv3_ops (void)
   1.330 -   gnu_v3_abi_ops.rtti_type = gnuv3_rtti_type;
   1.331 -   gnu_v3_abi_ops.virtual_fn_field = gnuv3_virtual_fn_field;
   1.332 -   gnu_v3_abi_ops.baseclass_offset = gnuv3_baseclass_offset;
   1.333 -+  gnu_v3_abi_ops.pass_by_reference = gnuv3_pass_by_reference;
   1.334 - }
   1.335 - 
   1.336 - extern initialize_file_ftype _initialize_gnu_v3_abi; /* -Wmissing-prototypes */
   1.337 -Index: gdb-6.3/gdb/hpacc-abi.c
   1.338 -===================================================================
   1.339 ---- gdb-6.3.orig/gdb/hpacc-abi.c	2003-06-08 14:27:13.000000000 -0400
   1.340 -+++ gdb-6.3/gdb/hpacc-abi.c	2004-11-10 12:30:07.000000000 -0500
   1.341 -@@ -3,7 +3,7 @@
   1.342 -    Most of the real code is from HP, i've just fiddled it to fit in
   1.343 -    the C++ ABI abstraction framework.
   1.344 - 
   1.345 --   Copyright 2001 Free Software Foundation, Inc.
   1.346 -+   Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
   1.347 - 
   1.348 -    This file is part of GDB.
   1.349 - 
   1.350 -Index: gdb-6.3/gdb/Makefile.in
   1.351 -===================================================================
   1.352 ---- gdb-6.3.orig/gdb/Makefile.in	2004-11-10 12:30:06.000000000 -0500
   1.353 -+++ gdb-6.3/gdb/Makefile.in	2004-11-10 12:30:07.000000000 -0500
   1.354 -@@ -2073,7 +2073,7 @@ ia64-tdep.o: ia64-tdep.c $(defs_h) $(inf
   1.355 - infcall.o: infcall.c $(defs_h) $(breakpoint_h) $(target_h) $(regcache_h) \
   1.356 - 	$(inferior_h) $(gdb_assert_h) $(block_h) $(gdbcore_h) $(language_h) \
   1.357 - 	$(objfiles_h) $(gdbcmd_h) $(command_h) $(gdb_string_h) $(infcall_h) \
   1.358 --	$(dummy_frame_h)
   1.359 -+	$(dummy_frame_h) $(cp_abi_h)
   1.360 - inf-child.o: inf-child.c $(defs_h) $(regcache_h) $(memattr_h) $(symtab_h) \
   1.361 - 	$(target_h) $(inferior_h) $(gdb_string_h)
   1.362 - infcmd.o: infcmd.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \
   1.363 -Index: gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.exp
   1.364 -===================================================================
   1.365 ---- /dev/null	1970-01-01 00:00:00.000000000 +0000
   1.366 -+++ gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.exp	2004-11-11 09:48:00.498518899 -0500
   1.367 -@@ -0,0 +1,38 @@
   1.368 -+# This testcase is part of GDB, the GNU debugger.
   1.369 -+
   1.370 -+# Copyright 2004 Free Software Foundation, Inc.
   1.371 -+
   1.372 -+# This program is free software; you can redistribute it and/or modify
   1.373 -+# it under the terms of the GNU General Public License as published by
   1.374 -+# the Free Software Foundation; either version 2 of the License, or
   1.375 -+# (at your option) any later version.
   1.376 -+#
   1.377 -+# This program is distributed in the hope that it will be useful,
   1.378 -+# but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.379 -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.380 -+# GNU General Public License for more details.
   1.381 -+#
   1.382 -+# You should have received a copy of the GNU General Public License
   1.383 -+# along with this program; if not, write to the Free Software
   1.384 -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
   1.385 -+
   1.386 -+# Check that GDB can call C++ functions whose parameters have
   1.387 -+# object type, but are passed by reference.
   1.388 -+
   1.389 -+set testfile "pass-by-ref"
   1.390 -+set srcfile ${testfile}.cc
   1.391 -+set binfile ${objdir}/${subdir}/${testfile}
   1.392 -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
   1.393 -+    return -1
   1.394 -+}
   1.395 -+
   1.396 -+gdb_exit
   1.397 -+gdb_start
   1.398 -+gdb_reinitialize_dir $srcdir/$subdir
   1.399 -+gdb_load ${binfile}
   1.400 -+
   1.401 -+if ![runto_main] then {
   1.402 -+    return -1
   1.403 -+}
   1.404 -+
   1.405 -+gdb_test "print foo (global_obj)" " = 3" "call function"
   1.406 -Index: gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.cc
   1.407 -===================================================================
   1.408 ---- /dev/null	1970-01-01 00:00:00.000000000 +0000
   1.409 -+++ gdb-6.3/gdb/testsuite/gdb.cp/pass-by-ref.cc	2004-11-11 09:44:17.815014667 -0500
   1.410 -@@ -0,0 +1,57 @@
   1.411 -+/* This testcase is part of GDB, the GNU debugger.
   1.412 -+
   1.413 -+   Copyright 2004 Free Software Foundation, Inc.
   1.414 -+
   1.415 -+   This program is free software; you can redistribute it and/or modify
   1.416 -+   it under the terms of the GNU General Public License as published by
   1.417 -+   the Free Software Foundation; either version 2 of the License, or
   1.418 -+   (at your option) any later version.
   1.419 -+
   1.420 -+   This program is distributed in the hope that it will be useful,
   1.421 -+   but WITHOUT ANY WARRANTY; without even the implied warranty of
   1.422 -+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   1.423 -+   GNU General Public License for more details.
   1.424 -+ 
   1.425 -+   You should have received a copy of the GNU General Public License
   1.426 -+   along with this program; if not, write to the Free Software
   1.427 -+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
   1.428 -+   USA.  */
   1.429 -+
   1.430 -+class Obj {
   1.431 -+public:
   1.432 -+  Obj ();
   1.433 -+  Obj (const Obj &);
   1.434 -+  ~Obj ();
   1.435 -+  int var[2];
   1.436 -+};
   1.437 -+
   1.438 -+int foo (Obj arg)
   1.439 -+{
   1.440 -+  return arg.var[0] + arg.var[1];
   1.441 -+}
   1.442 -+
   1.443 -+Obj::Obj ()
   1.444 -+{
   1.445 -+  var[0] = 1;
   1.446 -+  var[1] = 2;
   1.447 -+}
   1.448 -+
   1.449 -+Obj::Obj (const Obj &obj)
   1.450 -+{
   1.451 -+  var[0] = obj.var[0];
   1.452 -+  var[1] = obj.var[1];
   1.453 -+}
   1.454 -+
   1.455 -+Obj::~Obj ()
   1.456 -+{
   1.457 -+
   1.458 -+}
   1.459 -+
   1.460 -+Obj global_obj;
   1.461 -+
   1.462 -+int
   1.463 -+main ()
   1.464 -+{
   1.465 -+  int bar = foo (global_obj);
   1.466 -+  return bar;
   1.467 -+}