diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
index aca8b10bca6e39344a26271e3d3958feab9d5db5_bWVyY3VyaWFsL2NtZHV0aWwucHk=..70236d6fd84480422d01316b3ba44dac64bdf11b_bWVyY3VyaWFsL2NtZHV0aWwucHk= 100644
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -378,7 +378,7 @@
             return
 
         # check for overwrites
-        exists = os.path.exists(target)
+        exists = os.path.lexists(target)
         if not after and exists or after and state in 'mn':
             if not opts['force']:
                 ui.warn(_('%s: not overwriting - file exists\n') %
diff --git a/tests/test-rename b/tests/test-rename
index aca8b10bca6e39344a26271e3d3958feab9d5db5_dGVzdHMvdGVzdC1yZW5hbWU=..70236d6fd84480422d01316b3ba44dac64bdf11b_dGVzdHMvdGVzdC1yZW5hbWU= 100755
--- a/tests/test-rename
+++ b/tests/test-rename
@@ -158,6 +158,13 @@
 hg update -C
 rm d1/ca
 
+echo "# attempt to overwrite an existing broken symlink"
+ln -s ba d1/ca
+hg rename --traceback d1/ba d1/ca
+hg status -C
+hg update -C
+rm d1/ca
+
 echo "# replace a symlink with a file"
 ln -s ba d1/ca
 hg rename --force d1/ba d1/ca
diff --git a/tests/test-rename.out b/tests/test-rename.out
index aca8b10bca6e39344a26271e3d3958feab9d5db5_dGVzdHMvdGVzdC1yZW5hbWUub3V0..70236d6fd84480422d01316b3ba44dac64bdf11b_dGVzdHMvdGVzdC1yZW5hbWUub3V0 100644
--- a/tests/test-rename.out
+++ b/tests/test-rename.out
@@ -213,6 +213,10 @@
   d1/ba
 R d1/ba
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+# attempt to overwrite an existing broken symlink
+d1/ca: not overwriting - file exists
+? d1/ca
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 # replace a symlink with a file
 A d1/ca
   d1/ba