OSDN Git Service

2002-05-28 Phil Edwards <pme@gcc.gnu.org>
authorpme <pme@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 May 2002 23:15:18 +0000 (23:15 +0000)
committerpme <pme@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 May 2002 23:15:18 +0000 (23:15 +0000)
* testsuite/Makefile.am (noinst_LIBRARIES):  New target.  Pull in
CXX/INCLUDES.
* testsuite/Makefile.in:  Regenerate.
* testsuite/testsuite_hooks.h (gnu_copy_tracker):  Move from
list_modifiers.cc and rename from 'T'.  Move code bodies...
* testsuite/testsuite_hooks.cc:  ...to here.  New file.
* testsuite/23_containers/list_modifiers.cc:  Move 'T' class out.
* testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3_target_compile):
Add libv3test.a to link options.

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

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/23_containers/list_modifiers.cc
libstdc++-v3/testsuite/Makefile.am
libstdc++-v3/testsuite/Makefile.in
libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp
libstdc++-v3/testsuite/testsuite_hooks.cc [new file with mode: 0644]
libstdc++-v3/testsuite/testsuite_hooks.h

index 65f9f39..a8e3e70 100644 (file)
@@ -1,3 +1,15 @@
+2002-05-28  Phil Edwards  <pme@gcc.gnu.org>
+
+       * testsuite/Makefile.am (noinst_LIBRARIES):  New target.  Pull in
+       CXX/INCLUDES.
+       * testsuite/Makefile.in:  Regenerate.
+       * testsuite/testsuite_hooks.h (gnu_copy_tracker):  Move from
+       list_modifiers.cc and rename from 'T'.  Move code bodies...
+       * testsuite/testsuite_hooks.cc:  ...to here.  New file.
+       * testsuite/23_containers/list_modifiers.cc:  Move 'T' class out.
+       * testsuite/lib/libstdc++-v3-dg.exp (libstdc++-v3_target_compile):
+       Add libv3test.a to link options.
+
 2002-05-27  Benjamin Kosnik  <bkoz@redhat.com>
 
        * src/misc-inst.cc: Define unnecessary algorithm
index 9ce0781..14b5365 100644 (file)
 #include <list>
 #include <testsuite_hooks.h>
 
-bool test = true;
-
-// Here's a class with nontrivial ctor/dtor that provides
-// the ability to track the number of copy ctors and dtors
-// and will throw on demand during copy.
-class T
-{
-public:
-  // default constructor
-  T(int anId, bool throwOnDemand = false)
-  : itsId(anId), willThrow(throwOnDemand)
-  { }
-
-  // copy constructor
-  T(const T& rhs)
-  : itsId(rhs.id()), willThrow(rhs.willThrow)
-  {
-    ++itsCopyCount;
-    if (willThrow) 
-      throw "exception";
-  }
-
-  ~T()
-  { ++itsDtorCount; }
-
-  int
-  id() const
-  { return itsId; }
+typedef gnu_copy_tracker  T;
 
-private:
-  const int  itsId;
-  const bool willThrow;
-
-public:
-  static void
-  reset()
-  { itsCopyCount = 0; itsDtorCount = 0; }
-
-  static int
-  copyCount() 
-  { return itsCopyCount; }
-
-  static int
-  dtorCount() 
-  { return itsDtorCount; }
-
-private:
-  static int itsCopyCount;
-  static int itsDtorCount;
-};
-
-int T::itsCopyCount = 0;
-int T::itsDtorCount = 0;
+bool test = true;
 
 
 // This test verifies the following.
@@ -314,7 +264,7 @@ test03()
   VERIFY(e == list0301.end());
 }
 
-main(int argc, char* argv[])
+int main()
 {
     test01();
     test02();
index 6aecb39..dba4ccf 100644 (file)
@@ -1,6 +1,6 @@
 ## Makefile for the testsuite subdirectory of the GNU C++ Standard library.
 ##
-## Copyright (C) 2001 Free Software Foundation, Inc.
+## Copyright (C) 2001, 2002 Free Software Foundation, Inc.
 ##
 ## This file is part of the libstdc++ version 3 distribution.
 ## Process this file with automake to produce Makefile.in.
@@ -35,3 +35,12 @@ RUNTEST = `if [ -f @glibcpp_srcdir@/../dejagnu/runtest ] ; then \
 
 RUNTESTFLAGS =
 
+CXX = @glibcpp_CXX@ @GLIBCPP_INCLUDES@
+# Use common includes from acinclude.m4/GLIBCPP_EXPORT_INCLUDES
+INCLUDES = @TOPLEVEL_INCLUDES@
+
+noinst_LIBRARIES = libv3test.a
+
+libv3test_a_SOURCES = testsuite_hooks.cc
+
+
index 4e20e94..79c9a41 100644 (file)
@@ -1,6 +1,6 @@
-# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
 
-# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -68,6 +68,9 @@ AS = @AS@
 ATOMICITY_INC_SRCDIR = @ATOMICITY_INC_SRCDIR@
 AWK = @AWK@
 BASIC_FILE_H = @BASIC_FILE_H@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
 CC = @CC@
 CCODECVT_C = @CCODECVT_C@
 CCODECVT_H = @CCODECVT_H@
@@ -77,17 +80,27 @@ CPP = @CPP@
 CPU_LIMITS_INC_SRCDIR = @CPU_LIMITS_INC_SRCDIR@
 CSHADOW_FLAGS = @CSHADOW_FLAGS@
 CSTDIO_H = @CSTDIO_H@
-CXX = @CXX@
 CXXCPP = @CXXCPP@
 C_INCLUDE_DIR = @C_INCLUDE_DIR@
+DATADIRNAME = @DATADIRNAME@
 DEBUG_FLAGS = @DEBUG_FLAGS@
 DLLTOOL = @DLLTOOL@
 EXEEXT = @EXEEXT@
 EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@
 GCJ = @GCJ@
 GCJFLAGS = @GCJFLAGS@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
 GLIBCPP_INCLUDES = @GLIBCPP_INCLUDES@
 GLIBCPP_IS_CROSS_COMPILING = @GLIBCPP_IS_CROSS_COMPILING@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIBICONV = @LIBICONV@
 LIBIO_INCLUDES = @LIBIO_INCLUDES@
 LIBMATHOBJS = @LIBMATHOBJS@
 LIBMATH_INCLUDES = @LIBMATH_INCLUDES@
@@ -98,17 +111,22 @@ LIBUNWIND_FLAG = @LIBUNWIND_FLAG@
 LN_S = @LN_S@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MSGFMT = @MSGFMT@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
 OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@
 OPT_LDFLAGS = @OPT_LDFLAGS@
 OS_INC_SRCDIR = @OS_INC_SRCDIR@
 PACKAGE = @PACKAGE@
+POFILES = @POFILES@
+POSUB = @POSUB@
 RANLIB = @RANLIB@
 SECTION_FLAGS = @SECTION_FLAGS@
 SECTION_LDFLAGS = @SECTION_LDFLAGS@
 STRIP = @STRIP@
 TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
 USE_NLS = @USE_NLS@
 VERSION = @VERSION@
 WARN_FLAGS = @WARN_FLAGS@
@@ -149,9 +167,31 @@ RUNTEST = `if [ -f @glibcpp_srcdir@/../dejagnu/runtest ] ; then \
 
 
 RUNTESTFLAGS = 
+
+CXX = @glibcpp_CXX@ @GLIBCPP_INCLUDES@
+# Use common includes from acinclude.m4/GLIBCPP_EXPORT_INCLUDES
+INCLUDES = @TOPLEVEL_INCLUDES@
+
+noinst_LIBRARIES = libv3test.a
+
+libv3test_a_SOURCES = testsuite_hooks.cc
 mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
 CONFIG_HEADER = ../config.h
 CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libv3test_a_LIBADD = 
+libv3test_a_OBJECTS =  testsuite_hooks.$(OBJEXT)
+CXXFLAGS = @CXXFLAGS@
+CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@
 DIST_COMMON =  README Makefile.am Makefile.in
 
 
@@ -159,26 +199,120 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
 TAR = gtar
 GZIP_ENV = --best
+DEP_FILES =  .deps/testsuite_hooks.P
+SOURCES = $(libv3test_a_SOURCES)
+OBJECTS = $(libv3test_a_OBJECTS)
+
 all: all-redirect
 .SUFFIXES:
+.SUFFIXES: .S .c .cc .lo .o .obj .s
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
-       cd $(top_srcdir) && $(AUTOMAKE) --cygnus testsuite/Makefile
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile
 
-Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
        cd $(top_builddir) \
          && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
 
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+       $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+       -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+       $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+       $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+libv3test.a: $(libv3test_a_OBJECTS) $(libv3test_a_DEPENDENCIES)
+       -rm -f libv3test.a
+       $(AR) cru libv3test.a $(libv3test_a_OBJECTS) $(libv3test_a_LIBADD)
+       $(RANLIB) libv3test.a
+.cc.o:
+       $(CXXCOMPILE) -c $<
+.cc.obj:
+       $(CXXCOMPILE) -c `cygpath -w $<`
+.cc.lo:
+       $(LTCXXCOMPILE) -c $<
+
 tags: TAGS
-TAGS:
 
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
 
 distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
 
 subdir = testsuite
 
 distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign testsuite/Makefile
        @for file in $(DISTFILES); do \
-         if test -f $$file; then d=.; else d=$(srcdir); fi; \
+         d=$(srcdir); \
          if test -d $$d/$$file; then \
            cp -pr $$d/$$file $(distdir)/$$file; \
          else \
@@ -188,15 +322,62 @@ distdir: $(DISTFILES)
          fi; \
        done
 
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+
+%.o: %.cc
+       @echo '$(CXXCOMPILE) -c $<'; \
+       $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.cc
+       @echo '$(LTCXXCOMPILE) -c $<'; \
+       $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+
 RUNTESTDEFAULTFLAGS = --tool $(DEJATOOL) --srcdir $$srcdir
 
 check-DEJAGNU: site.exp
        srcdir=`cd $(srcdir) && pwd`; export srcdir; \
        EXPECT=$(EXPECT); export EXPECT; \
-       if [ -f $(top_builddir)/../expect/expect ]; then \
-         TCL_LIBRARY=`cd $(top_srcdir)/../tcl/library && pwd`; \
-         export TCL_LIBRARY; \
-       fi; \
        runtest=$(RUNTEST); \
        if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
          $$runtest $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
@@ -225,13 +406,11 @@ info-am:
 info: info-am
 dvi-am:
 dvi: dvi-am
-check-am:
+check-am: all-am
        $(MAKE) $(AM_MAKEFLAGS) check-DEJAGNU
 check: check-am
 installcheck-am:
 installcheck: installcheck-am
-install-info-am: 
-install-info: install-info-am
 install-exec-am:
 install-exec: install-exec-am
 
@@ -243,7 +422,7 @@ install-am: all-am
 install: install-am
 uninstall-am:
 uninstall: uninstall-am
-all-am: Makefile
+all-am: Makefile $(LIBRARIES)
 all-redirect: all-am
 install-strip:
        $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
@@ -259,31 +438,46 @@ distclean-generic:
        -rm -f config.cache config.log stamp-h stamp-h[0-9]*
 
 maintainer-clean-generic:
-mostlyclean-am:  mostlyclean-generic
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+               mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+               mostlyclean-generic
 
 mostlyclean: mostlyclean-am
 
-clean-am:  clean-generic mostlyclean-am
+clean-am:  clean-noinstLIBRARIES clean-compile clean-libtool clean-tags \
+               clean-depend clean-generic mostlyclean-am
 
 clean: clean-am
 
-distclean-am:  distclean-generic clean-am
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+               distclean-libtool distclean-tags distclean-depend \
+               distclean-generic clean-am
        -rm -f libtool
 
 distclean: distclean-am
 
-maintainer-clean-am:  maintainer-clean-generic distclean-am
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+               maintainer-clean-compile maintainer-clean-libtool \
+               maintainer-clean-tags maintainer-clean-depend \
+               maintainer-clean-generic distclean-am
        @echo "This command is intended for maintainers to use;"
        @echo "it deletes files that may require special tools to rebuild."
 
 maintainer-clean: maintainer-clean-am
 
-.PHONY: tags distdir check-DEJAGNU info-am info dvi-am dvi check \
-check-am installcheck-am installcheck install-info-am install-info \
-install-exec-am install-exec install-data-am install-data install-am \
-install uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend check-DEJAGNU info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
index adbd148..a9433ef 100644 (file)
@@ -196,7 +196,12 @@ proc libstdc++-v3_target_compile { source dest type options } {
     set cxx_final [concat $cxx_final $cxxflags]
     set cxx_final [concat $cxx_final $includes]
 
-    lappend options "compiler=$cxx_final";
+    lappend options "compiler=$cxx_final"
+
+    # Picks up our local freshly-built testsuite library.  We could just
+    # name it directly, "./libv3test.a" but this is more portable.
+    lappend options "ldflags=-L."
+    lappend options "libs=-lv3test"
 
     return [target_compile $source $dest $type $options]
 }
diff --git a/libstdc++-v3/testsuite/testsuite_hooks.cc b/libstdc++-v3/testsuite/testsuite_hooks.cc
new file mode 100644 (file)
index 0000000..53bd753
--- /dev/null
@@ -0,0 +1,77 @@
+// Utility subroutines for the C++ library testsuite.
+//
+// Copyright (C) 2002 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+//
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+#include <testsuite_hooks.h>
+
+#ifdef _GLIBCPP_MEM_LIMITS
+#include <sys/resource.h>
+#include <unistd.h>
+
+void
+__set_testsuite_memlimit(float __size)
+{
+    struct rlimit r;
+    rlim_t limit = (rlim_t)(__size * 1048576);
+
+    // Heap size, seems to be common.
+#if _GLIBCPP_HAVE_MEMLIMIT_DATA
+    getrlimit(RLIMIT_DATA, &r);
+    r.rlim_cur = limit;
+    setrlimit(RLIMIT_DATA, &r);
+#endif
+
+    // Resident set size.
+#if _GLIBCPP_HAVE_MEMLIMIT_RSS
+    getrlimit(RLIMIT_RSS, &r);
+    r.rlim_cur = limit;
+    setrlimit(RLIMIT_RSS, &r);
+#endif
+
+    // Mapped memory (brk + mmap).
+#if _GLIBCPP_HAVE_MEMLIMIT_VMEM
+    getrlimit(RLIMIT_VMEM, &r);
+    r.rlim_cur = limit;
+    setrlimit(RLIMIT_VMEM, &r);
+#endif
+
+    // Virtual memory.
+#if _GLIBCPP_HAVE_MEMLIMIT_AS
+    getrlimit(RLIMIT_AS, &r);
+    r.rlim_cur = limit;
+    setrlimit(RLIMIT_AS, &r);
+#endif
+}
+#endif /* _GLIBCPP_MEM_LIMITS */
+
+
+gnu_counting_struct::size_type  gnu_counting_struct::count = 0;
+
+int gnu_copy_tracker::itsCopyCount = 0;
+int gnu_copy_tracker::itsDtorCount = 0;
+
index eb87d51..4412336 100644 (file)
 //   which starts at zero, increments on instance construction, and decrements
 //   on instance destruction.  "assert_count(n)" can be called to VERIFY()
 //   that the count equals N.
+//
+// 4)  gnu_copy_tracker, from Stephen M. Webb <stephen@bregmasoft.com>.
+//   A class with nontrivial ctor/dtor that provides the ability to track the
+//   number of copy ctors and dtors, and will throw on demand during copy.
 
 #ifndef _GLIBCPP_TESTSUITE_HOOKS_H
 #define _GLIBCPP_TESTSUITE_HOOKS_H
 
 // Defined in GLIBCPP_CONFIGURE_TESTSUITE.
 #ifndef _GLIBCPP_MEM_LIMITS
-
 // Don't do memory limits.
-void
+extern void
 __set_testsuite_memlimit(float x = 0)
 { }
 
 #else
 
 // Do memory limits.
-#include <sys/resource.h>
-#include <unistd.h>
-
 #ifndef MEMLIMIT_MB
 #define MEMLIMIT_MB 16.0
 #endif
 
-void
-__set_testsuite_memlimit(float __size = MEMLIMIT_MB)
-{
-    struct rlimit r;
-    rlim_t limit = (rlim_t)(__size * 1048576);
-
-    // Heap size, seems to be common.
-#if _GLIBCPP_HAVE_MEMLIMIT_DATA
-    getrlimit(RLIMIT_DATA, &r);
-    r.rlim_cur = limit;
-    setrlimit(RLIMIT_DATA, &r);
-#endif
-
-    // Resident set size.
-#if _GLIBCPP_HAVE_MEMLIMIT_RSS
-    getrlimit(RLIMIT_RSS, &r);
-    r.rlim_cur = limit;
-    setrlimit(RLIMIT_RSS, &r);
-#endif
-
-    // Mapped memory (brk + mmap).
-#if _GLIBCPP_HAVE_MEMLIMIT_VMEM
-    getrlimit(RLIMIT_VMEM, &r);
-    r.rlim_cur = limit;
-    setrlimit(RLIMIT_VMEM, &r);
-#endif
-
-    // Virtual memory.
-#if _GLIBCPP_HAVE_MEMLIMIT_AS
-    getrlimit(RLIMIT_AS, &r);
-    r.rlim_cur = limit;
-    setrlimit(RLIMIT_AS, &r);
-#endif
-}
+extern void
+__set_testsuite_memlimit(float __size = MEMLIMIT_MB);
 #endif
 
 
 struct gnu_counting_struct
 {
     // Specifically and glaringly-obviously marked 'signed' so that when
-    // count mistakenly goes negative, we can track the patterns of
-    // deletions easier.
+    // COUNT mistakenly goes negative, we can track the patterns of
+    // deletions more easily.
     typedef  signed int     size_type;
     static size_type   count;
     gnu_counting_struct() { ++count; }
@@ -128,7 +96,56 @@ struct gnu_counting_struct
 
 #define assert_count(n)   VERIFY(gnu_counting_struct::count == n)
 
-gnu_counting_struct::size_type  gnu_counting_struct::count = 0;
+
+class gnu_copy_tracker
+{
+  public:
+    // Cannot be explicit.  Conversion ctor used by list_modifiers.cc's
+    // test03(), "range fill at beginning".
+    gnu_copy_tracker (int anId, bool throwOnDemand = false)
+    : itsId(anId), willThrow(throwOnDemand)
+    {}
+
+    gnu_copy_tracker (const gnu_copy_tracker& rhs)
+    : itsId(rhs.id()), willThrow(rhs.willThrow)
+    {
+      ++itsCopyCount;
+      if (willThrow) throw "copy tracker exception";
+    }
+
+    gnu_copy_tracker& operator=(const gnu_copy_tracker& rhs)
+    {
+      itsId = rhs.id();
+      // willThrow must obviously already be false to get this far
+    }
+
+    ~gnu_copy_tracker() { ++itsDtorCount; }
+
+    int
+    id() const
+    { return itsId; }
+
+  private:
+          int   itsId;
+    const bool  willThrow;
+
+  public:
+    static void
+    reset()
+    { itsCopyCount = 0; itsDtorCount = 0; }
+
+    static int
+    copyCount() 
+    { return itsCopyCount; }
+
+    static int
+    dtorCount() 
+    { return itsDtorCount; }
+
+  private:
+    static int itsCopyCount;
+    static int itsDtorCount;
+};
 
 
 #endif // _GLIBCPP_TESTSUITE_HOOKS_H