diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 1ebb51cb65e9f..6ad7b7d9da122 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -463,6 +463,13 @@ impl<'a> SourceCollector<'a> { }; let contents = str::from_utf8_owned(contents).unwrap(); + // Remove the utf-8 BOM if any + let contents = if contents.starts_with("\ufeff") { + contents.as_slice().slice_from(3) + } else { + contents.as_slice() + }; + // Create the intermediate directories let mut cur = self.dst.clone(); let mut root_path = ~"../../"; @@ -482,7 +489,7 @@ impl<'a> SourceCollector<'a> { root_path: root_path, }; try!(layout::render(&mut w as &mut Writer, &self.cx.layout, - &page, &(""), &Source(contents.as_slice()))); + &page, &(""), &Source(contents))); try!(w.flush()); return Ok(()); } diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index 4bfd5391a8f10..d93b5803eac30 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -271,13 +271,22 @@ impl CodeMap { } } - pub fn new_filemap(&self, filename: FileName, mut src: ~str) -> Rc { + pub fn new_filemap(&self, filename: FileName, src: ~str) -> Rc { let mut files = self.files.borrow_mut(); let start_pos = match files.get().last() { None => 0, Some(last) => last.deref().start_pos.to_uint() + last.deref().src.len(), }; + // Remove utf-8 BOM if any. + // FIXME #12884: no efficient/safe way to remove from the start of a string + // and reuse the allocation. + let mut src = if src.starts_with("\ufeff") { + src.as_slice().slice_from(3).into_owned() + } else { + src + }; + // Append '\n' in case it's not already there. // This is a workaround to prevent CodeMap.lookup_filemap_idx from accidentally // overflowing into the next filemap in case the last byte of span is also the last diff --git a/src/test/run-pass/utf8-bom.rs b/src/test/run-pass/utf8-bom.rs new file mode 100644 index 0000000000000..ccd40cb88fe08 --- /dev/null +++ b/src/test/run-pass/utf8-bom.rs @@ -0,0 +1,13 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This file has utf-8 BOM, it should be compiled normally without error. + +pub fn main() {}