diff --git a/src/librustc/middle/trans/controlflow.rs b/src/librustc/middle/trans/controlflow.rs
index ec00f144308..a43b1f41a37 100644
--- a/src/librustc/middle/trans/controlflow.rs
+++ b/src/librustc/middle/trans/controlflow.rs
@@ -14,6 +14,7 @@ use middle::trans::base::*;
 use middle::trans::build::*;
 use middle::trans::callee;
 use middle::trans::common::*;
+use middle::trans::debuginfo;
 use middle::trans::expr;
 use middle::ty;
 use util::common::indenter;
@@ -75,6 +76,7 @@ pub fn trans_if(bcx: @mut Block,
             // if true { .. } [else { .. }]
             return do with_scope(bcx, thn.info(), "if_true_then") |bcx| {
                 let bcx_out = trans_block(bcx, thn, dest);
+                debuginfo::clear_source_location(bcx.fcx);
                 trans_block_cleanups(bcx_out, block_cleanups(bcx))
             }
         } else {
@@ -86,6 +88,7 @@ pub fn trans_if(bcx: @mut Block,
                 Some(elexpr) => {
                     return do with_scope(bcx, elexpr.info(), "if_false_then") |bcx| {
                         let bcx_out = trans_if_else(bcx, elexpr, dest);
+                        debuginfo::clear_source_location(bcx.fcx);
                         trans_block_cleanups(bcx_out, block_cleanups(bcx))
                     }
                 }
@@ -98,6 +101,8 @@ pub fn trans_if(bcx: @mut Block,
     let then_bcx_in = scope_block(bcx, thn.info(), "then");
 
     let then_bcx_out = trans_block(then_bcx_in, thn, dest);
+
+    debuginfo::clear_source_location(bcx.fcx);
     let then_bcx_out = trans_block_cleanups(then_bcx_out,
                                             block_cleanups(then_bcx_in));
 
@@ -122,6 +127,9 @@ pub fn trans_if(bcx: @mut Block,
     debug!("then_bcx_in={}, else_bcx_in={}",
            then_bcx_in.to_str(), else_bcx_in.to_str());
 
+    // Clear the source location because it is still set to whatever has been translated
+    // right before.
+    debuginfo::clear_source_location(else_bcx_in.fcx);
     CondBr(bcx, cond_val, then_bcx_in.llbb, else_bcx_in.llbb);
     return next_bcx;
 
@@ -139,6 +147,7 @@ pub fn trans_if(bcx: @mut Block,
             // would be nice to have a constraint on ifs
             _ => else_bcx_in.tcx().sess.bug("strange alternative in if")
         };
+        debuginfo::clear_source_location(else_bcx_in.fcx);
         trans_block_cleanups(else_bcx_out, block_cleanups(else_bcx_in))
     }
 }
diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs
index c6a33864620..e52b0c2058a 100644
--- a/src/librustc/middle/trans/debuginfo.rs
+++ b/src/librustc/middle/trans/debuginfo.rs
@@ -509,6 +509,17 @@ pub fn set_source_location(fcx: &FunctionContext,
     }
 }
 
+/// Clears the current debug location.
+///
+/// Instructions generated hereafter won't be assigned a source location.
+pub fn clear_source_location(fcx: &FunctionContext) {
+    if fn_should_be_ignored(fcx) {
+        return;
+    }
+
+    set_debug_location(fcx.ccx, UnknownLocation);
+}
+
 /// Enables emitting source locations for the given functions.
 ///
 /// Since we don't want source locations to be emitted for the function prelude, they are disabled