about summary refs log tree commit diff
path: root/src/libsyntax_ext
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-12-30 16:06:30 +0000
committerbors <bors@rust-lang.org>2018-12-30 16:06:30 +0000
commit953a9cf10d66c164d925e138b5b3d8a2bfc1f2ca (patch)
treebca4ec4f3008a8ab2493c58470fa54841338789f /src/libsyntax_ext
parent3ce6f6eca6f0c6df09b8efd45b3eec7ea94d2b25 (diff)
parentdf4690ddf4b6eb699bc5c283934c26f6c9a05df6 (diff)
downloadrust-953a9cf10d66c164d925e138b5b3d8a2bfc1f2ca.tar.gz
rust-953a9cf10d66c164d925e138b5b3d8a2bfc1f2ca.zip
Auto merge of #57205 - petrochenkov:extrecov, r=estebank
Improve error recovery for some built-in macros

Fixes https://github.com/rust-lang/rust/issues/55897
Diffstat (limited to 'src/libsyntax_ext')
-rw-r--r--src/libsyntax_ext/compile_error.rs2
-rw-r--r--src/libsyntax_ext/concat.rs7
-rw-r--r--src/libsyntax_ext/concat_idents.rs6
-rw-r--r--src/libsyntax_ext/env.rs2
-rw-r--r--src/libsyntax_ext/format.rs26
5 files changed, 26 insertions, 17 deletions
diff --git a/src/libsyntax_ext/compile_error.rs b/src/libsyntax_ext/compile_error.rs
index fd018885a26..8f7f5deb091 100644
--- a/src/libsyntax_ext/compile_error.rs
+++ b/src/libsyntax_ext/compile_error.rs
@@ -10,7 +10,7 @@ pub fn expand_compile_error<'cx>(cx: &'cx mut ExtCtxt,
                               tts: &[tokenstream::TokenTree])
                               -> Box<dyn base::MacResult + 'cx> {
     let var = match get_single_str_from_tts(cx, sp, tts, "compile_error!") {
-        None => return DummyResult::expr(sp),
+        None => return DummyResult::any(sp),
         Some(v) => v,
     };
 
diff --git a/src/libsyntax_ext/concat.rs b/src/libsyntax_ext/concat.rs
index a19c7e427e3..807f190cb6a 100644
--- a/src/libsyntax_ext/concat.rs
+++ b/src/libsyntax_ext/concat.rs
@@ -18,6 +18,7 @@ pub fn expand_syntax_ext(
     };
     let mut accumulator = String::new();
     let mut missing_literal = vec![];
+    let mut has_errors = false;
     for e in es {
         match e.node {
             ast::ExprKind::Lit(ref lit) => match lit.node {
@@ -41,6 +42,9 @@ pub fn expand_syntax_ext(
                     cx.span_err(e.span, "cannot concatenate a byte string literal");
                 }
             },
+            ast::ExprKind::Err => {
+                has_errors = true;
+            }
             _ => {
                 missing_literal.push(e.span);
             }
@@ -50,6 +54,9 @@ pub fn expand_syntax_ext(
         let mut err = cx.struct_span_err(missing_literal, "expected a literal");
         err.note("only literals (like `\"foo\"`, `42` and `3.14`) can be passed to `concat!()`");
         err.emit();
+        return base::DummyResult::expr(sp);
+    } else if has_errors {
+        return base::DummyResult::expr(sp);
     }
     let sp = sp.apply_mark(cx.current_expansion.mark);
     base::MacEager::expr(cx.expr_str(sp, Symbol::intern(&accumulator)))
diff --git a/src/libsyntax_ext/concat_idents.rs b/src/libsyntax_ext/concat_idents.rs
index 9c49a59678f..de96de4bdc2 100644
--- a/src/libsyntax_ext/concat_idents.rs
+++ b/src/libsyntax_ext/concat_idents.rs
@@ -24,7 +24,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt,
 
     if tts.is_empty() {
         cx.span_err(sp, "concat_idents! takes 1 or more arguments.");
-        return DummyResult::expr(sp);
+        return DummyResult::any(sp);
     }
 
     let mut res_str = String::new();
@@ -34,7 +34,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt,
                 TokenTree::Token(_, token::Comma) => {}
                 _ => {
                     cx.span_err(sp, "concat_idents! expecting comma.");
-                    return DummyResult::expr(sp);
+                    return DummyResult::any(sp);
                 }
             }
         } else {
@@ -43,7 +43,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt,
                     res_str.push_str(&ident.as_str()),
                 _ => {
                     cx.span_err(sp, "concat_idents! requires ident args.");
-                    return DummyResult::expr(sp);
+                    return DummyResult::any(sp);
                 }
             }
         }
diff --git a/src/libsyntax_ext/env.rs b/src/libsyntax_ext/env.rs
index 33669c8bc37..16fb64a5f39 100644
--- a/src/libsyntax_ext/env.rs
+++ b/src/libsyntax_ext/env.rs
@@ -79,7 +79,7 @@ pub fn expand_env<'cx>(cx: &'cx mut ExtCtxt,
     let e = match env::var(&*var.as_str()) {
         Err(_) => {
             cx.span_err(sp, &msg.as_str());
-            cx.expr_usize(sp, 0)
+            return DummyResult::expr(sp);
         }
         Ok(s) => cx.expr_str(sp, Symbol::intern(&s)),
     };
diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs
index 95bb8c886ab..ac1402a0faa 100644
--- a/src/libsyntax_ext/format.rs
+++ b/src/libsyntax_ext/format.rs
@@ -748,18 +748,20 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt,
             fmt
         }
         Ok(fmt) => fmt,
-        Err(mut err) => {
-            let sugg_fmt = match args.len() {
-                0 => "{}".to_string(),
-                _ => format!("{}{{}}", "{} ".repeat(args.len())),
-            };
-            err.span_suggestion_with_applicability(
-                fmt_sp.shrink_to_lo(),
-                "you might be missing a string literal to format with",
-                format!("\"{}\", ", sugg_fmt),
-                Applicability::MaybeIncorrect,
-            );
-            err.emit();
+        Err(err) => {
+            if let Some(mut err) = err {
+                let sugg_fmt = match args.len() {
+                    0 => "{}".to_string(),
+                    _ => format!("{}{{}}", "{} ".repeat(args.len())),
+                };
+                err.span_suggestion_with_applicability(
+                    fmt_sp.shrink_to_lo(),
+                    "you might be missing a string literal to format with",
+                    format!("\"{}\", ", sugg_fmt),
+                    Applicability::MaybeIncorrect,
+                );
+                err.emit();
+            }
             return DummyResult::raw_expr(sp, true);
         }
     };