From bd0110a3cbbe0568c43f714b928e0601864ddc08 Mon Sep 17 00:00:00 2001
From: Hans-Peter Nilsson <hp@axis.com>
Date: Thu, 28 Sep 2000 22:57:26 +0000
Subject: [PATCH] 	* ld-selective/5.cc: New test. 	*
 ld-selective/selective.exp: Run it as xfailed.

	* ld-selective/4.cc: Correct spelling of "lose".
---
 ld/testsuite/ChangeLog                  |  7 ++++
 ld/testsuite/ld-selective/4.cc          |  4 +-
 ld/testsuite/ld-selective/5.cc          | 32 ++++++++++++++++
 ld/testsuite/ld-selective/selective.exp | 49 +++++++++++++++++++++++++
 4 files changed, 90 insertions(+), 2 deletions(-)
 create mode 100644 ld/testsuite/ld-selective/5.cc

diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 8b8f20ded1b..20d42ff2019 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2000-09-29  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	* ld-selective/5.cc: New test.
+	* ld-selective/selective.exp: Run it as xfailed.
+
+	* ld-selective/4.cc: Correct spelling of "lose".
+
 2000-09-05  Alan Modra  <alan@linuxcare.com.au>
 
 	* ld-selective/selective.exp: Remove the xfails for hppa.
diff --git a/ld/testsuite/ld-selective/4.cc b/ld/testsuite/ld-selective/4.cc
index 9df26ac872c..02864a731cd 100644
--- a/ld/testsuite/ld-selective/4.cc
+++ b/ld/testsuite/ld-selective/4.cc
@@ -4,7 +4,7 @@ struct A
   virtual void bar();
 };
 
-void A::foo() { }			// loose
+void A::foo() { }			// lose
 void A::bar() { }			// keep
 
 struct B : public A
@@ -12,7 +12,7 @@ struct B : public A
   virtual void foo();
 };
 
-void B::foo() { }			// loose
+void B::foo() { }			// lose
 
 void _start() __asm__("_start");	// keep
 
diff --git a/ld/testsuite/ld-selective/5.cc b/ld/testsuite/ld-selective/5.cc
new file mode 100644
index 00000000000..f5289f874a7
--- /dev/null
+++ b/ld/testsuite/ld-selective/5.cc
@@ -0,0 +1,32 @@
+struct A
+{
+  virtual void foo();
+  virtual void bar();
+};
+
+void A::foo() { }			// lose
+void A::bar() { }			// keep
+
+struct B : public A
+{
+  virtual void foo();
+};
+
+void B::foo() { }			// lose
+
+void _start() __asm__("_start");	// keep
+
+A a;					// keep
+B b;
+A *getme() { return &a; }		// keep
+
+extern B* dropme2();
+void dropme1() { dropme2()->foo(); }	// lose
+B *dropme2() { return &b; }		// lose
+
+void _start()
+{
+  getme()->bar();
+}
+
+extern "C" void __main() { }
diff --git a/ld/testsuite/ld-selective/selective.exp b/ld/testsuite/ld-selective/selective.exp
index 20b3a12cd0b..862c10b8b1c 100644
--- a/ld/testsuite/ld-selective/selective.exp
+++ b/ld/testsuite/ld-selective/selective.exp
@@ -32,6 +32,7 @@ set test2 "selective2"
 set test3 "selective3"
 set test4 "selective4"
 set test5 "selective5"
+set test6 "selective6"
 
 set cflags "-w -O2 -ffunction-sections -fdata-sections"
 set cxxflags "-fvtable-gc -fno-exceptions -fno-rtti"
@@ -43,6 +44,7 @@ if { [which $CXX] == 0 } {
     untested $test3
     untested $test4
     untested $test5
+    untested $test6
     return
 }
 
@@ -191,3 +193,50 @@ if ![ld_simple_link $ld tmpdir/4.x "$ldflags tmpdir/4.o"] {
 	}
     }
 }
+
+if { ![ld_compile "$CC $cflags $cxxflags" $srcdir/$subdir/5.cc tmpdir/5.o]} {
+    unresolved $test6
+    return
+}
+
+# Exposes a bug, currently.  FIXME: Fix it.
+# FIXME: Break out the nesting to a function that takes two lists, one
+# with expected present symbols, one with expected absent symbols, and
+# iterates over nm output.  Use that function in all tests here.
+
+setup_xfail "*-*-*"
+
+if ![ld_simple_link $ld tmpdir/5.x "$ldflags tmpdir/5.o"] {
+    fail $test6
+} else {
+    if ![ld_nm $nm tmpdir/5.x] {
+	unresolved $test6
+    } else {
+	if {[info exists nm_output(foo__1B)]} {
+            send_log "foo__1B == $nm_output(foo__1B)\n"
+            verbose "foo__1B == $nm_output(foo__1B)"
+	    fail $test6
+	} else {
+	    if {[info exists nm_output(foo__1A)]} {
+	        send_log "foo__1A == $nm_output(foo__1A)\n"
+		verbose "foo__1A == $nm_output(foo__1A)"
+		fail $test6
+	    } else {
+		if {[info exists nm_output(dropme1__Fv)]} {
+		    send_log "dropme1__Fv == $nm_output(dropme1__Fv)\n"
+		    verbose "dropme1__Fv == $nm_output(dropme1__Fv)"
+		    fail $test6
+		} else {
+		    if {[info exists nm_output(dropme2__Fv)]} {
+			send_log "dropme2__Fv == $nm_output(dropme2__Fv)\n"
+			verbose "dropme2__Fv == $nm_output(dropme2__Fv)"
+			fail $test6
+		    } else {
+			pass $test6
+		    }
+		}
+	    }
+	}
+    }
+}
+