提交 f68029ec 编写于 作者: B Brian Anderson

Make fatal errors work with codes, add to typeck

上级 0c5225c5
...@@ -69,6 +69,9 @@ impl Session { ...@@ -69,6 +69,9 @@ impl Session {
pub fn span_fatal(&self, sp: Span, msg: &str) -> ! { pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
self.diagnostic().span_fatal(sp, msg) self.diagnostic().span_fatal(sp, msg)
} }
pub fn span_fatal_with_code(&self, sp: Span, msg: &str, code: &str) -> ! {
self.diagnostic().span_fatal_with_code(sp, msg, code)
}
pub fn fatal(&self, msg: &str) -> ! { pub fn fatal(&self, msg: &str) -> ! {
self.diagnostic().handler().fatal(msg) self.diagnostic().handler().fatal(msg)
} }
......
...@@ -339,22 +339,22 @@ fn create_substs_for_ast_path<'tcx>( ...@@ -339,22 +339,22 @@ fn create_substs_for_ast_path<'tcx>(
} else { } else {
"expected" "expected"
}; };
this.tcx().sess.span_fatal(span, span_fatal!(this.tcx().sess, span, E0243,
&format!("wrong number of type arguments: {} {}, found {}", "wrong number of type arguments: {} {}, found {}",
expected, expected,
required_ty_param_count, required_ty_param_count,
supplied_ty_param_count)[]); supplied_ty_param_count);
} else if supplied_ty_param_count > formal_ty_param_count { } else if supplied_ty_param_count > formal_ty_param_count {
let expected = if required_ty_param_count < formal_ty_param_count { let expected = if required_ty_param_count < formal_ty_param_count {
"expected at most" "expected at most"
} else { } else {
"expected" "expected"
}; };
this.tcx().sess.span_fatal(span, span_fatal!(this.tcx().sess, span, E0244,
&format!("wrong number of type arguments: {} {}, found {}", "wrong number of type arguments: {} {}, found {}",
expected, expected,
formal_ty_param_count, formal_ty_param_count,
supplied_ty_param_count)[]); supplied_ty_param_count);
} }
let mut substs = Substs::new_type(types, regions); let mut substs = Substs::new_type(types, regions);
...@@ -557,10 +557,9 @@ pub fn instantiate_trait_ref<'tcx>( ...@@ -557,10 +557,9 @@ pub fn instantiate_trait_ref<'tcx>(
trait_ref trait_ref
} }
_ => { _ => {
this.tcx().sess.span_fatal( span_fatal!(this.tcx().sess, ast_trait_ref.path.span, E0245,
ast_trait_ref.path.span, "`{}` is not a trait",
&format!("`{}` is not a trait", ast_trait_ref.path.user_string(this.tcx()));
ast_trait_ref.path.user_string(this.tcx()))[]);
} }
} }
} }
...@@ -1036,7 +1035,7 @@ pub fn ast_ty_to_ty<'tcx>( ...@@ -1036,7 +1035,7 @@ pub fn ast_ty_to_ty<'tcx>(
match ast_ty_to_ty_cache.get(&ast_ty.id) { match ast_ty_to_ty_cache.get(&ast_ty.id) {
Some(&ty::atttce_resolved(ty)) => return ty, Some(&ty::atttce_resolved(ty)) => return ty,
Some(&ty::atttce_unresolved) => { Some(&ty::atttce_unresolved) => {
tcx.sess.span_fatal(ast_ty.span, span_fatal!(tcx.sess, ast_ty.span, E0246,
"illegal recursive type; insert an enum \ "illegal recursive type; insert an enum \
or struct in the cycle, if this is \ or struct in the cycle, if this is \
desired"); desired");
...@@ -1136,9 +1135,9 @@ pub fn ast_ty_to_ty<'tcx>( ...@@ -1136,9 +1135,9 @@ pub fn ast_ty_to_ty<'tcx>(
ty::mk_self_type(tcx) ty::mk_self_type(tcx)
} }
def::DefMod(id) => { def::DefMod(id) => {
tcx.sess.span_fatal(ast_ty.span, span_fatal!(tcx.sess, ast_ty.span, E0247,
&format!("found module name used as a type: {}", "found module name used as a type: {}",
tcx.map.node_to_string(id.node))[]); tcx.map.node_to_string(id.node));
} }
def::DefPrimTy(_) => { def::DefPrimTy(_) => {
panic!("DefPrimTy arm missed in previous ast_ty_to_prim_ty call"); panic!("DefPrimTy arm missed in previous ast_ty_to_prim_ty call");
...@@ -1164,10 +1163,10 @@ pub fn ast_ty_to_ty<'tcx>( ...@@ -1164,10 +1163,10 @@ pub fn ast_ty_to_ty<'tcx>(
associated_path_def_to_ty(this, ast_ty, provenance, assoc_ident.name) associated_path_def_to_ty(this, ast_ty, provenance, assoc_ident.name)
} }
_ => { _ => {
tcx.sess.span_fatal(ast_ty.span, span_fatal!(tcx.sess, ast_ty.span, E0248,
&format!("found value name used \ "found value name used \
as a type: {:?}", as a type: {:?}",
a_def)[]); a_def);
} }
} }
} }
...@@ -1185,17 +1184,16 @@ pub fn ast_ty_to_ty<'tcx>( ...@@ -1185,17 +1184,16 @@ pub fn ast_ty_to_ty<'tcx>(
ty::mk_vec(tcx, ast_ty_to_ty(this, rscope, &**ty), ty::mk_vec(tcx, ast_ty_to_ty(this, rscope, &**ty),
Some(i as uint)), Some(i as uint)),
_ => { _ => {
tcx.sess.span_fatal( span_fatal!(tcx.sess, ast_ty.span, E0249,
ast_ty.span, "expected constant expr for array length"); "expected constant expr for array length");
} }
} }
} }
Err(ref r) => { Err(ref r) => {
tcx.sess.span_fatal( span_fatal!(tcx.sess, ast_ty.span, E0250,
ast_ty.span, "expected constant expr for array \
&format!("expected constant expr for array \
length: {}", length: {}",
*r)[]); *r);
} }
} }
} }
......
...@@ -5224,7 +5224,7 @@ fn param<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, n: u32) -> Ty<'tcx> { ...@@ -5224,7 +5224,7 @@ fn param<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, n: u32) -> Ty<'tcx> {
"get_tydesc" => { "get_tydesc" => {
let tydesc_ty = match ty::get_tydesc_ty(ccx.tcx) { let tydesc_ty = match ty::get_tydesc_ty(ccx.tcx) {
Ok(t) => t, Ok(t) => t,
Err(s) => { tcx.sess.span_fatal(it.span, &s[]); } Err(s) => { span_fatal!(tcx.sess, it.span, E0240, "{}", &s[]); }
}; };
let td_ptr = ty::mk_ptr(ccx.tcx, ty::mt { let td_ptr = ty::mk_ptr(ccx.tcx, ty::mt {
ty: tydesc_ty, ty: tydesc_ty,
......
...@@ -160,7 +160,18 @@ ...@@ -160,7 +160,18 @@
E0236, // no lang item for range syntax E0236, // no lang item for range syntax
E0237, // no lang item for range syntax E0237, // no lang item for range syntax
E0238, // parenthesized parameters may only be used with a trait E0238, // parenthesized parameters may only be used with a trait
E0239 // `next` method of `Iterator` trait has unexpected type E0239, // `next` method of `Iterator` trait has unexpected type
E0240,
E0241,
E0242, // internal error looking up a definition
E0243, // wrong number of type arguments
E0244, // wrong number of type arguments
E0245, // not a trait
E0246, // illegal recursive type
E0247, // found module name used as a type
E0248, // found value name used as a type
E0249, // expected constant expr for array length
E0250 // expected constant expr for array length
} }
__build_diagnostic_array! { DIAGNOSTICS } __build_diagnostic_array! { DIAGNOSTICS }
......
...@@ -162,7 +162,7 @@ fn lookup_def_tcx(tcx:&ty::ctxt, sp: Span, id: ast::NodeId) -> def::Def { ...@@ -162,7 +162,7 @@ fn lookup_def_tcx(tcx:&ty::ctxt, sp: Span, id: ast::NodeId) -> def::Def {
match tcx.def_map.borrow().get(&id) { match tcx.def_map.borrow().get(&id) {
Some(x) => x.clone(), Some(x) => x.clone(),
_ => { _ => {
tcx.sess.span_fatal(sp, "internal error looking up a definition") span_fatal!(tcx.sess, sp, E0242, "internal error looking up a definition")
} }
} }
} }
......
...@@ -92,6 +92,10 @@ pub fn span_fatal(&self, sp: Span, msg: &str) -> ! { ...@@ -92,6 +92,10 @@ pub fn span_fatal(&self, sp: Span, msg: &str) -> ! {
self.handler.emit(Some((&self.cm, sp)), msg, Fatal); self.handler.emit(Some((&self.cm, sp)), msg, Fatal);
panic!(FatalError); panic!(FatalError);
} }
pub fn span_fatal_with_code(&self, sp: Span, msg: &str, code: &str) -> ! {
self.handler.emit_with_code(Some((&self.cm, sp)), msg, code, Fatal);
panic!(FatalError);
}
pub fn span_err(&self, sp: Span, msg: &str) { pub fn span_err(&self, sp: Span, msg: &str) {
self.handler.emit(Some((&self.cm, sp)), msg, Error); self.handler.emit(Some((&self.cm, sp)), msg, Error);
self.handler.bump_err_count(); self.handler.bump_err_count();
......
...@@ -14,6 +14,14 @@ ...@@ -14,6 +14,14 @@
($code:tt) => (__register_diagnostic! { $code }) ($code:tt) => (__register_diagnostic! { $code })
} }
#[macro_export]
macro_rules! span_fatal {
($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({
__diagnostic_used!($code);
$session.span_fatal_with_code($span, format!($($message)*).as_slice(), stringify!($code))
})
}
#[macro_export] #[macro_export]
macro_rules! span_err { macro_rules! span_err {
($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({ ($session:expr, $span:expr, $code:ident, $($message:tt)*) => ({
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册