--- gcc/cgraphunit.c.jj	2012-11-06 09:03:53.000000000 +0100
+++ gcc/cgraphunit.c	2012-11-08 13:16:48.010938659 +0100
@@ -1413,16 +1413,16 @@ assemble_thunk (struct cgraph_node *node
       DECL_INITIAL (thunk_fndecl) = fn_block;
       init_function_start (thunk_fndecl);
       cfun->is_thunk = 1;
+      insn_locations_init ();
+      set_curr_insn_location (DECL_SOURCE_LOCATION (thunk_fndecl));
+      prologue_location = curr_insn_location ();
       assemble_start_function (thunk_fndecl, fnname);
-      (*debug_hooks->source_line) (DECL_SOURCE_LINE (thunk_fndecl),
-				   DECL_SOURCE_FILE (thunk_fndecl),
-				   /* discriminator */ 0,
-				   /* is_stmt */ 1);
 
       targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
 				       fixed_offset, virtual_value, alias);
 
       assemble_end_function (thunk_fndecl, fnname);
+      insn_locations_finalize ();
       init_insn_lengths ();
       free_after_compilation (cfun);
       set_cfun (NULL);
--- gcc/testsuite/g++.dg/debug/pr54499.C.jj	2012-11-08 13:23:19.906740003 +0100
+++ gcc/testsuite/g++.dg/debug/pr54499.C	2012-11-08 13:23:55.189531409 +0100
@@ -0,0 +1,22 @@
+// PR debug/54499
+// { dg-do assemble }
+
+struct S1
+{
+  virtual void f () = 0;
+};
+
+struct S2
+{
+  virtual ~S2 () { }
+};
+
+struct S3 : public S1, public S2
+{
+  void f ();
+};
+
+void
+S3::f ()
+{
+}
