+1999-02-07 Jonathan Larmour <jlarmour@cygnus.co.uk>
+
+ * g++.dg/special/ecos.exp: New driver for new tests with special
+ requirements
+
+ * g++.dg/special/conpr-1.C: New test
+ * g++.dg/special/conpr-2.C: New test
+ * g++.dg/special/conpr-2a.C: New test
+ * g++.dg/special/conpr-3.C: New test
+ * g++.dg/special/conpr-3a.C: New test
+ * g++.dg/special/conpr-3b.C: New test
+
+ * lib/g++-dg.exp: New driver file, based on lib/gcc-dg.exp to
+ allow g++ to use the dg driver
+
+ * README: Add comment about g++.dg directory
+
Sat Feb 6 18:00:38 1999 Jeffrey A Law (law@cygnus.com)
* README: Update email addresses.
ftp://egcs.cygnus.com/pub/egcs/infrastructure, for example.
Most of these tests were originally developed and/or collected by
-Cygnus Support, but these days many are being added by the EGCS
+Cygnus Solutions, but these days many are being added by the EGCS
developers.
These tests are included "as is". If any of them fails, do not report
STRUCTURE OF THE TESTSUITE
-All C++ tests reside in subdirectories of g++.old-deja, based on the
-following structure:
+Almost all C++ tests reside in subdirectories of g++.old-deja, based on
+the following structure:
g++.benjamin Tests by Benjamin Koz
g++.bob
g++.rfg
g++.robertl Tests from egcs-bugs@egcs.cygnus.com, gathered by Robert Lipe
+g++.old-deja uses a fixed driver for all g++ tests based on the old
+DejaGnu drivers. But just because its old, doesn't mean its redundant!
+Tests that want to use the normal dg.exp driver can be put in g++.dg instead.
+This may be required for platform-specific tests, or tests with other
+special requirements.
--- /dev/null
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+public:
+ foo_t(void) { x=1; }
+ int get(void) { return x; }
+};
+
+static foo_t foo __attribute__((init_priority(5000)));
+
+int main(void) {
+
+ if (foo.get())
+ exit(0);
+ else
+ abort();
+}
--- /dev/null
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+int foo_t::count;
+
+extern foo_t foo1, foo2;
+
+int main(void) {
+
+ if ( (foo1.get() != 2) || (foo2.get() != 1) )
+ abort();
+ exit(0);
+}
--- /dev/null
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+foo_t foo1 __attribute__((init_priority(6000)));
+foo_t foo2 __attribute__((init_priority(5000)));
--- /dev/null
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+int foo_t::count;
+
+extern foo_t foo1, foo2;
+
+int main(void) {
+
+ if ( (foo1.get() != 2) || (foo2.get() != 1) )
+ abort();
+ exit(0);
+}
--- /dev/null
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+foo_t foo1 __attribute__((init_priority(6000)));
--- /dev/null
+/* { dg-do run } */
+
+class foo_t {
+ int x;
+ static int count;
+public:
+ foo_t(void) { x=++count; }
+ int get(void) { return x; }
+};
+
+foo_t foo2 __attribute__((init_priority(5000)));
--- /dev/null
+# Copyright (C) 1999 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# jlarmour@cygnus.co.uk
+
+# This file was written by Jonathan Larmour (jlarmour@cygnus.co.uk).
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+###########
+# conpr-1.C
+###########
+
+dg-init
+dg-runtest "$srcdir/$subdir/conpr-1.C" "-finit-priority" ""
+dg-finish
+
+
+###########
+# conpr-2.C
+###########
+
+dg-init
+
+set lines [g++_target_compile "$srcdir/$subdir/conpr-2a.C" "conpr-2a.o" object "additional_flags=-finit-priority"]
+if ![string match "" $lines] then {
+ fail "conpr-2a.o"
+} else {
+ dg-runtest "$srcdir/$subdir/conpr-2.C" "conpr-2a.o" "-finit-priority"
+ file delete conpr-2a.o
+}
+dg-finish
+
+
+###########
+# conpr-3.C
+###########
+
+dg-init
+
+set lines [g++_target_compile "$srcdir/$subdir/conpr-3a.C" "conpr-3a.o" object "additional_flags=-finit-priority"]
+if ![string match "" $lines] then {
+ fail "conpr-3a.o"
+} else {
+ set lines [g++_target_compile "$srcdir/$subdir/conpr-3b.C" "conpr-3b.o" object "additional_flags=-finit-priority"]
+ if ![string match "" $lines] then {
+ fail "conpr-3b.o"
+ } else {
+ # run it with objects both ways around!
+ dg-runtest "$srcdir/$subdir/conpr-3.C" "conpr-3a.o conpr-3b.o" "-finit-priority"
+ dg-runtest "$srcdir/$subdir/conpr-3.C" "conpr-3b.o conpr-3a.o" "-finit-priority"
+ file delete conpr-3a.o conpr-3b.o
+ }
+}
+dg-finish
+
+
+### EOF ecos.exp
--- /dev/null
+// Submitted by Jason Merrill <jason@cygnus.com>.
+// Bug: g++ fails to see through the T typedef in the C ctor.
+// Build don't link:
+
+struct A {
+ A (int) { }
+};
+
+typedef A T;
+
+struct B: public virtual T {
+ B (): T(1) { }
+};
+
+struct C: public B {
+ C (): T(1) { }
+};
--- /dev/null
+// Test for nested template template parameter feature
+
+template <template<template <class> class> class TTT> struct C
+{
+ int f();
+};
+
+template <template<template <class> class> class TTT> int C<TTT>::f()
+{
+ return 0;
+}
+
+template <template <class> class TT> struct D
+{
+};
+
+int main()
+{
+ C<D> c;
+ c.f();
+}
--- /dev/null
+// Test for nested template template parameter feature
+
+template <template<template <class> class> class TTT> struct C
+{
+ int f() { return 0; }
+};
+
+template <template <class> class TT> struct D
+{
+ int a;
+};
+
+template <template <class> class TT> struct E
+{
+ int a;
+ int b;
+};
+
+template <template <template <template<class> class> class> class TTT>
+int g(TTT<E> t)
+{
+ TTT<D> tt;
+ return tt.f();
+}
+
+int main()
+{
+ C<E> c;
+ g(c);
+}
--- /dev/null
+// Build don't link:
+
+// Testing overloading of function argument involving template template
+// parameters
+
+// Reported by Thomus Kunert <kunert@physik.tu-dresden.de>
+
+template<class A>
+class H{};
+
+template <class T>
+void f( const T& ){} // #1
+
+template< template<class, class> class X,
+ class A, class B>
+void f( const X<A,B> & x ) // #2
+{}
+
+int main()
+{
+ H<int> h;
+ f(h); // #3
+}
--- /dev/null
+# Copyright (C) 1997, 1999 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-g++@prep.ai.mit.edu
+
+# Define g++ callbacks for dg.exp.
+
+load_lib dg.exp
+
+proc g++-dg-test { prog do_what extra_tool_flags } {
+ # Set up the compiler flags, based on what we're going to do.
+
+ switch $do_what {
+ "preprocess" {
+ set compile_type "preprocess"
+ set output_file "[file rootname [file tail $prog]].i"
+ }
+ "compile" {
+ set compile_type "assembly"
+ set output_file "[file rootname [file tail $prog]].s"
+ }
+ "assemble" {
+ set compile_type "object"
+ set output_file "[file rootname [file tail $prog]].o"
+ }
+ "link" {
+ set compile_type "executable"
+ set output_file "a.out"
+ # The following line is needed for targets like the i960 where
+ # the default output file is b.out. Sigh.
+ }
+ "run" {
+ set compile_type "executable"
+ # FIXME: "./" is to cope with "." not being in $PATH.
+ # Should this be handled elsewhere?
+ # YES.
+ set output_file "./a.out"
+ # This is the only place where we care if an executable was
+ # created or not. If it was, dg.exp will try to run it.
+ remote_file build delete $output_file;
+ }
+ default {
+ perror "$do_what: not a valid dg-do keyword"
+ return ""
+ }
+ }
+ set options ""
+ if { $extra_tool_flags != "" } {
+ lappend options "additional_flags=$extra_tool_flags"
+ }
+
+ set comp_output [g++_target_compile "$prog" "$output_file" "$compile_type" $options];
+
+ return [list $comp_output $output_file]
+}
+
+
+proc g++-dg-prune { system text } {
+
+ # If we see "region xxx is full" then the testcase is too big for ram.
+ # This is tricky to deal with in a large testsuite like c-torture so
+ # deal with it here. Just mark the testcase as unsupported.
+ if [regexp "(^|\n)\[^\n\]*: region \[^\n\]* is full" $text] {
+ # The format here is important. See dg.exp.
+ return "::unsupported::memory full"
+ }
+
+ return $text
+}