about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--appveyor.yml3
-rw-r--r--clippy_lints/src/misc.rs14
-rw-r--r--clippy_lints/src/returns.rs12
-rw-r--r--clippy_lints/src/strings.rs4
-rw-r--r--clippy_lints/src/types.rs23
-rw-r--r--clippy_lints/src/utils/mod.rs8
-rw-r--r--tests/ui/cast_alignment.rs2
-rw-r--r--tests/ui/cast_alignment.stderr4
-rw-r--r--tests/ui/needless_return.stderr2
-rw-r--r--tests/ui/string_lit_as_bytes.fixed5
-rw-r--r--tests/ui/string_lit_as_bytes.rs5
-rw-r--r--tests/ui/string_lit_as_bytes.stderr6
12 files changed, 54 insertions, 34 deletions
diff --git a/appveyor.yml b/appveyor.yml
index 66a1c83b205..9f6cc45af81 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -8,11 +8,10 @@ environment:
         - TARGET: x86_64-pc-windows-msvc
 
 branches:
-    # Only build AppVeyor on r+, try and the master branch
+    # Only build AppVeyor on r+ and try branch
     only:
       - auto
       - try
-      - master
 
 install:
     - curl -sSf -o rustup-init.exe https://win.rustup.rs/
diff --git a/clippy_lints/src/misc.rs b/clippy_lints/src/misc.rs
index d77f71c2ab2..acca50e3df8 100644
--- a/clippy_lints/src/misc.rs
+++ b/clippy_lints/src/misc.rs
@@ -7,7 +7,7 @@ use rustc::ty;
 use rustc::{declare_lint_pass, declare_tool_lint};
 use rustc_errors::Applicability;
 use syntax::ast::LitKind;
-use syntax::source_map::{ExpnFormat, Span};
+use syntax::source_map::{ExpnKind, Span};
 
 use crate::consts::{constant, Constant};
 use crate::utils::sugg::Sugg;
@@ -596,10 +596,14 @@ fn is_used(cx: &LateContext<'_, '_>, expr: &Expr) -> bool {
 /// Tests whether an expression is in a macro expansion (e.g., something
 /// generated by `#[derive(...)]` or the like).
 fn in_attributes_expansion(expr: &Expr) -> bool {
-    expr.span
-        .ctxt()
-        .outer_expn_info()
-        .map_or(false, |info| matches!(info.format, ExpnFormat::MacroAttribute(_)))
+    use syntax::ext::hygiene::MacroKind;
+    expr.span.ctxt().outer_expn_info().map_or(false, |info| {
+        if let ExpnKind::Macro(MacroKind::Attr, _) = info.kind {
+            true
+        } else {
+            false
+        }
+    })
 }
 
 /// Tests whether `res` is a variable defined outside a macro.
diff --git a/clippy_lints/src/returns.rs b/clippy_lints/src/returns.rs
index 2245b719c23..0f2084e819e 100644
--- a/clippy_lints/src/returns.rs
+++ b/clippy_lints/src/returns.rs
@@ -86,7 +86,7 @@ declare_clippy_lint! {
 #[derive(PartialEq, Eq, Copy, Clone)]
 enum RetReplacement {
     Empty,
-    Unit,
+    Block,
 }
 
 declare_lint_pass!(Return => [NEEDLESS_RETURN, LET_AND_RETURN, UNUSED_UNIT]);
@@ -139,7 +139,7 @@ impl Return {
             // a match expr, check all arms
             ast::ExprKind::Match(_, ref arms) => {
                 for arm in arms {
-                    self.check_final_expr(cx, &arm.body, Some(arm.body.span), RetReplacement::Unit);
+                    self.check_final_expr(cx, &arm.body, Some(arm.body.span), RetReplacement::Block);
                 }
             },
             _ => (),
@@ -176,12 +176,12 @@ impl Return {
                         );
                     });
                 },
-                RetReplacement::Unit => {
+                RetReplacement::Block => {
                     span_lint_and_then(cx, NEEDLESS_RETURN, ret_span, "unneeded return statement", |db| {
                         db.span_suggestion(
                             ret_span,
-                            "replace `return` with the unit type",
-                            "()".to_string(),
+                            "replace `return` with an empty block",
+                            "{}".to_string(),
                             Applicability::MachineApplicable,
                         );
                     });
@@ -317,7 +317,7 @@ fn attr_is_cfg(attr: &ast::Attribute) -> bool {
 
 // get the def site
 fn get_def(span: Span) -> Option<Span> {
-    span.ctxt().outer_expn_info().and_then(|info| info.def_site)
+    span.ctxt().outer_expn_info().and_then(|info| Some(info.def_site))
 }
 
 // is this expr a `()` unit?
diff --git a/clippy_lints/src/strings.rs b/clippy_lints/src/strings.rs
index eae464ee249..57f63a600a7 100644
--- a/clippy_lints/src/strings.rs
+++ b/clippy_lints/src/strings.rs
@@ -138,6 +138,9 @@ fn is_add(cx: &LateContext<'_, '_>, src: &Expr, target: &Expr) -> bool {
     }
 }
 
+// Max length a b"foo" string can take
+const MAX_LENGTH_BYTE_STRING_LIT: usize = 32;
+
 declare_lint_pass!(StringLitAsBytes => [STRING_LIT_AS_BYTES]);
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for StringLitAsBytes {
@@ -173,6 +176,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for StringLitAsBytes {
                             );
                         } else if callsite == expanded
                             && lit_content.as_str().chars().all(|c| c.is_ascii())
+                            && lit_content.as_str().len() <= MAX_LENGTH_BYTE_STRING_LIT
                             && !in_macro_or_desugar(args[0].span)
                         {
                             span_lint_and_sugg(
diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs
index b674b3888ab..4f35337292e 100644
--- a/clippy_lints/src/types.rs
+++ b/clippy_lints/src/types.rs
@@ -621,9 +621,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitArg {
 }
 
 fn is_questionmark_desugar_marked_call(expr: &Expr) -> bool {
-    use syntax_pos::hygiene::CompilerDesugaringKind;
+    use syntax_pos::hygiene::DesugaringKind;
     if let ExprKind::Call(ref callee, _) = expr.node {
-        callee.span.is_compiler_desugaring(CompilerDesugaringKind::QuestionMark)
+        callee.span.is_desugaring(DesugaringKind::QuestionMark)
     } else {
         false
     }
@@ -789,7 +789,8 @@ declare_clippy_lint! {
     /// **Why is this bad?** Dereferencing the resulting pointer may be undefined
     /// behavior.
     ///
-    /// **Known problems:** None.
+    /// **Known problems:** Using `std::ptr::read_unaligned` and `std::ptr::write_unaligned` or similar
+    /// on the resulting pointer is fine.
     ///
     /// **Example:**
     /// ```rust
@@ -1210,17 +1211,25 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Casts {
             if_chain! {
                 if let ty::RawPtr(from_ptr_ty) = &cast_from.sty;
                 if let ty::RawPtr(to_ptr_ty) = &cast_to.sty;
-                if let Some(from_align) = cx.layout_of(from_ptr_ty.ty).ok().map(|a| a.align.abi);
-                if let Some(to_align) = cx.layout_of(to_ptr_ty.ty).ok().map(|a| a.align.abi);
-                if from_align < to_align;
+                if let Ok(from_layout) = cx.layout_of(from_ptr_ty.ty);
+                if let Ok(to_layout) = cx.layout_of(to_ptr_ty.ty);
+                if from_layout.align.abi < to_layout.align.abi;
                 // with c_void, we inherently need to trust the user
                 if !is_c_void(cx, from_ptr_ty.ty);
+                // when casting from a ZST, we don't know enough to properly lint
+                if !from_layout.is_zst();
                 then {
                     span_lint(
                         cx,
                         CAST_PTR_ALIGNMENT,
                         expr.span,
-                        &format!("casting from `{}` to a more-strictly-aligned pointer (`{}`)", cast_from, cast_to)
+                        &format!(
+                            "casting from `{}` to a more-strictly-aligned pointer (`{}`) ({} < {} bytes)",
+                            cast_from,
+                            cast_to,
+                            from_layout.align.abi.bytes(),
+                            to_layout.align.abi.bytes(),
+                        ),
                     );
                 }
             }
diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs
index 53665506c39..9e45c453ae9 100644
--- a/clippy_lints/src/utils/mod.rs
+++ b/clippy_lints/src/utils/mod.rs
@@ -43,7 +43,7 @@ use rustc_errors::Applicability;
 use smallvec::SmallVec;
 use syntax::ast::{self, LitKind};
 use syntax::attr;
-use syntax::ext::hygiene::ExpnFormat;
+use syntax::ext::hygiene::ExpnKind;
 use syntax::source_map::{Span, DUMMY_SP};
 use syntax::symbol::{kw, Symbol};
 
@@ -100,7 +100,7 @@ pub fn in_macro_or_desugar(span: Span) -> bool {
 /// Returns `true` if this `expn_info` was expanded by any macro.
 pub fn in_macro(span: Span) -> bool {
     if let Some(info) = span.ctxt().outer_expn_info() {
-        if let ExpnFormat::CompilerDesugaring(..) = info.format {
+        if let ExpnKind::Desugaring(..) = info.kind {
             false
         } else {
             true
@@ -686,7 +686,7 @@ pub fn is_adjusted(cx: &LateContext<'_, '_>, e: &Expr) -> bool {
 /// See also `is_direct_expn_of`.
 pub fn is_expn_of(mut span: Span, name: &str) -> Option<Span> {
     loop {
-        let span_name_span = span.ctxt().outer_expn_info().map(|ei| (ei.format.name(), ei.call_site));
+        let span_name_span = span.ctxt().outer_expn_info().map(|ei| (ei.kind.descr(), ei.call_site));
 
         match span_name_span {
             Some((mac_name, new_span)) if mac_name.as_str() == name => return Some(new_span),
@@ -706,7 +706,7 @@ pub fn is_expn_of(mut span: Span, name: &str) -> Option<Span> {
 /// `bar!` by
 /// `is_direct_expn_of`.
 pub fn is_direct_expn_of(span: Span, name: &str) -> Option<Span> {
-    let span_name_span = span.ctxt().outer_expn_info().map(|ei| (ei.format.name(), ei.call_site));
+    let span_name_span = span.ctxt().outer_expn_info().map(|ei| (ei.kind.descr(), ei.call_site));
 
     match span_name_span {
         Some((mac_name, new_span)) if mac_name.as_str() == name => Some(new_span),
diff --git a/tests/ui/cast_alignment.rs b/tests/ui/cast_alignment.rs
index 08450ba1176..4c08935639f 100644
--- a/tests/ui/cast_alignment.rs
+++ b/tests/ui/cast_alignment.rs
@@ -22,4 +22,6 @@ fn main() {
     // For c_void, we should trust the user. See #2677
     (&1u32 as *const u32 as *const std::os::raw::c_void) as *const u32;
     (&1u32 as *const u32 as *const libc::c_void) as *const u32;
+    // For ZST, we should trust the user. See #4256
+    (&1u32 as *const u32 as *const ()) as *const u32;
 }
diff --git a/tests/ui/cast_alignment.stderr b/tests/ui/cast_alignment.stderr
index 0077be1b570..79219f86155 100644
--- a/tests/ui/cast_alignment.stderr
+++ b/tests/ui/cast_alignment.stderr
@@ -1,4 +1,4 @@
-error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`)
+error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`) (1 < 2 bytes)
   --> $DIR/cast_alignment.rs:12:5
    |
 LL |     (&1u8 as *const u8) as *const u16;
@@ -6,7 +6,7 @@ LL |     (&1u8 as *const u8) as *const u16;
    |
    = note: `-D clippy::cast-ptr-alignment` implied by `-D warnings`
 
-error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`)
+error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1 < 2 bytes)
   --> $DIR/cast_alignment.rs:13:5
    |
 LL |     (&mut 1u8 as *mut u8) as *mut u16;
diff --git a/tests/ui/needless_return.stderr b/tests/ui/needless_return.stderr
index 7858ecfba97..ee700ab8408 100644
--- a/tests/ui/needless_return.stderr
+++ b/tests/ui/needless_return.stderr
@@ -70,7 +70,7 @@ error: unneeded return statement
   --> $DIR/needless_return.rs:64:14
    |
 LL |         _ => return,
-   |              ^^^^^^ help: replace `return` with the unit type: `()`
+   |              ^^^^^^ help: replace `return` with an empty block: `{}`
 
 error: aborting due to 12 previous errors
 
diff --git a/tests/ui/string_lit_as_bytes.fixed b/tests/ui/string_lit_as_bytes.fixed
index a70504656d9..1922478165f 100644
--- a/tests/ui/string_lit_as_bytes.fixed
+++ b/tests/ui/string_lit_as_bytes.fixed
@@ -6,10 +6,11 @@
 fn str_lit_as_bytes() {
     let bs = b"hello there";
 
-    let bs = br###"raw string with three ### in it and some " ""###;
+    let bs = br###"raw string with 3# plus " ""###;
 
-    // no warning, because this cannot be written as a byte string literal:
+    // no warning, because these cannot be written as byte string literals:
     let ubs = "☃".as_bytes();
+    let ubs = "hello there! this is a very long string".as_bytes();
 
     let strify = stringify!(foobar).as_bytes();
 
diff --git a/tests/ui/string_lit_as_bytes.rs b/tests/ui/string_lit_as_bytes.rs
index ea8c712854b..560cbcb657b 100644
--- a/tests/ui/string_lit_as_bytes.rs
+++ b/tests/ui/string_lit_as_bytes.rs
@@ -6,10 +6,11 @@
 fn str_lit_as_bytes() {
     let bs = "hello there".as_bytes();
 
-    let bs = r###"raw string with three ### in it and some " ""###.as_bytes();
+    let bs = r###"raw string with 3# plus " ""###.as_bytes();
 
-    // no warning, because this cannot be written as a byte string literal:
+    // no warning, because these cannot be written as byte string literals:
     let ubs = "☃".as_bytes();
+    let ubs = "hello there! this is a very long string".as_bytes();
 
     let strify = stringify!(foobar).as_bytes();
 
diff --git a/tests/ui/string_lit_as_bytes.stderr b/tests/ui/string_lit_as_bytes.stderr
index f51cd71a6dc..59aaec75bd2 100644
--- a/tests/ui/string_lit_as_bytes.stderr
+++ b/tests/ui/string_lit_as_bytes.stderr
@@ -9,11 +9,11 @@ LL |     let bs = "hello there".as_bytes();
 error: calling `as_bytes()` on a string literal
   --> $DIR/string_lit_as_bytes.rs:9:14
    |
-LL |     let bs = r###"raw string with three ### in it and some " ""###.as_bytes();
-   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `br###"raw string with three ### in it and some " ""###`
+LL |     let bs = r###"raw string with 3# plus " ""###.as_bytes();
+   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using a byte string literal instead: `br###"raw string with 3# plus " ""###`
 
 error: calling `as_bytes()` on `include_str!(..)`
-  --> $DIR/string_lit_as_bytes.rs:16:22
+  --> $DIR/string_lit_as_bytes.rs:17:22
    |
 LL |     let includestr = include_str!("entry.rs").as_bytes();
    |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `include_bytes!(..)` instead: `include_bytes!("entry.rs")`