diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1014832241d37b6e9ff8f233abfc923161d2608b..484e5101746ddab9656b2fe044ebc9c793a352a6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
 2009-11-04  Jason Merrill  <jason@redhat.com>
 
+	PR c++/15882
+	* method.c (use_thunk): Check DECL_WEAK as well as
+	DECL_ONE_ONLY.
+
 	PR c++/17365, DR 218
 	* name-lookup.c (add_function): Ignore non-functions.
 
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 266406c7cd0f8d94a4c499df9a89cc1c0e2d2559..f13d99df20f7c8039e77d52ff1463bc43585cb8d 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -378,7 +378,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
   DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
   DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
     = DECL_VISIBILITY_SPECIFIED (function);
-  if (DECL_ONE_ONLY (function))
+  if (DECL_ONE_ONLY (function) || DECL_WEAK (function))
     make_decl_one_only (thunk_fndecl, cxx_comdat_group (thunk_fndecl));
 
   if (flag_syntax_only)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a0e861bc6c5141bb4bf65ca1c6f962a4ccf1270a..86c9b11cac5cb039c24a1e3c68ef5abd28a296a0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-04  Jason Merrill  <jason@redhat.com>
+
+	PR c++/15882
+	* g++.dg/abi/thunk5.C: New.
+
 2009-11-04  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
 	PR rtl-opt/41833
diff --git a/gcc/testsuite/g++.dg/abi/thunk5.C b/gcc/testsuite/g++.dg/abi/thunk5.C
new file mode 100644
index 0000000000000000000000000000000000000000..623b9bcd850dff8bbb9b326715778623eef51a72
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/thunk5.C
@@ -0,0 +1,13 @@
+// PR c++/15882
+// The thunks should be weak even on targets without one-only support.
+// { dg-require-weak "" }
+// { dg-final { scan-assembler "weak.*ZTv" } }
+
+struct A
+{
+  virtual ~A() { }
+};
+
+struct B: virtual A { };
+
+B b;