about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2014-06-04 16:59:27 -0400
committerAndrew Gallant <jamslam@gmail.com>2014-06-04 16:59:27 -0400
commit0f73bf32fe7d4e805f2bd16e3d6de66e90b3d3bf (patch)
tree106d770ce65b797188da2530140498826e16b4c3
parenta6401b52263336c22879d4ffae3eded97949ee7b (diff)
downloadrust-0f73bf32fe7d4e805f2bd16e3d6de66e90b3d3bf.tar.gz
rust-0f73bf32fe7d4e805f2bd16e3d6de66e90b3d3bf.zip
Fixes #14185.
This fix suppresses dead_code warnings from code generated by regex! when
the result of regex! is unused. Correct behavior should be a single
unused variable warning.

Regression tests are included for both `let` and `static` bound regex!
values.
-rw-r--r--src/libregex_macros/lib.rs9
-rw-r--r--src/test/compile-fail-fulldeps/syntax-extension-regex-unused-static.rs32
-rw-r--r--src/test/compile-fail-fulldeps/syntax-extension-regex-unused.rs28
3 files changed, 69 insertions, 0 deletions
diff --git a/src/libregex_macros/lib.rs b/src/libregex_macros/lib.rs
index 71e3d06cf96..ca64db3e2f7 100644
--- a/src/libregex_macros/lib.rs
+++ b/src/libregex_macros/lib.rs
@@ -142,11 +142,20 @@ impl<'a> NfaGen<'a> {
         let regex = self.original.as_slice();
 
         quote_expr!(self.cx, {
+// When `regex!` is bound to a name that is not used, we have to make sure
+// that dead_code warnings don't bubble up to the user from the generated
+// code. Therefore, we suppress them by allowing dead_code. The effect is that
+// the user is only warned about *their* unused variable/code, and not the
+// unused code generated by regex!. See #14185 for an example.
+#[allow(dead_code)]
 static CAP_NAMES: &'static [Option<&'static str>] = &$cap_names;
+
+#[allow(dead_code)]
 fn exec<'t>(which: ::regex::native::MatchKind, input: &'t str,
             start: uint, end: uint) -> Vec<Option<uint>> {
     #![allow(unused_imports)]
     #![allow(unused_mut)]
+
     use regex::native::{
         MatchKind, Exists, Location, Submatches,
         StepState, StepMatchEarlyReturn, StepMatch, StepContinue,
diff --git a/src/test/compile-fail-fulldeps/syntax-extension-regex-unused-static.rs b/src/test/compile-fail-fulldeps/syntax-extension-regex-unused-static.rs
new file mode 100644
index 00000000000..300e7e524df
--- /dev/null
+++ b/src/test/compile-fail-fulldeps/syntax-extension-regex-unused-static.rs
@@ -0,0 +1,32 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// FIXME(#13725) windows needs fixing.
+// ignore-win32
+// ignore-stage1
+
+#![feature(phase)]
+
+extern crate regex;
+#[phase(syntax)] extern crate regex_macros;
+
+#[deny(unused_variable)]
+#[deny(dead_code)]
+
+// Tests to make sure that extraneous dead code warnings aren't emitted from
+// the code generated by regex!.
+//
+// The warning used for `static` items seems to be dead_code, which is why this
+// is a distinct test from using a normal let binding (which generates an
+// unused variable warning).
+
+fn main() {
+    static fubar: regex::Regex = regex!("abc"); //~ ERROR code is never used: `fubar`
+}
diff --git a/src/test/compile-fail-fulldeps/syntax-extension-regex-unused.rs b/src/test/compile-fail-fulldeps/syntax-extension-regex-unused.rs
new file mode 100644
index 00000000000..c77bd52d9e5
--- /dev/null
+++ b/src/test/compile-fail-fulldeps/syntax-extension-regex-unused.rs
@@ -0,0 +1,28 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// FIXME(#13725) windows needs fixing.
+// ignore-win32
+// ignore-stage1
+
+#![feature(phase)]
+
+extern crate regex;
+#[phase(syntax)] extern crate regex_macros;
+
+#[deny(unused_variable)]
+#[deny(dead_code)]
+
+// Tests to make sure that extraneous dead code warnings aren't emitted from
+// the code generated by regex!.
+
+fn main() {
+    let fubar = regex!("abc"); //~ ERROR unused variable: `fubar`
+}