Index: hash.c
===================================================================
--- hash.c	(revision 809)
+++ hash.c	(working copy)
@@ -1415,7 +1415,7 @@
 static VALUE
 rb_hash_merge(VALUE hash1, VALUE hash2)
 {
-    return rb_hash_update(rb_hash_dup(hash1), hash2);
+    return rb_hash_update(rb_obj_dup(hash1), hash2);
 }
 
 static int
Index: test/ruby/test_hash.rb
===================================================================
--- test/ruby/test_hash.rb	(revision 809)
+++ test/ruby/test_hash.rb	(working copy)
@@ -784,7 +784,30 @@
     assert_equal({1=>3, 3=>4, 5=>7}, h1.merge(h2))
     assert_equal({1=>6, 3=>4, 5=>7}, h1.merge(h2) {|k, v1, v2| k + v1 + v2 })
   end
+  
+  def test_merge_with_default
+    h = Hash.new do |h, k|
+      12
+    end
+    h = h.merge({1 => 2})
+    assert_equal(h[1], 2)
+    assert_equal(h[:random], 12)
 
+    h = Hash.new do |h, k|
+      12
+    end
+    h.merge!({1 => 2})
+    assert_equal(h[1], 2)
+    assert_equal(h[:random], 12)
+
+    h = Hash.new do |h, k|
+      12
+    end
+    h.merge({1 => 2})
+    assert_equal(h[1], 12)
+    assert_equal(h[:random], 12)
+  end
+
   def test_assoc
     assert_equal([3,4], {1=>2, 3=>4, 5=>6}.assoc(3))
     assert_nil({1=>2, 3=>4, 5=>6}.assoc(4))
