Merge pull request #25 from alexcrichton/ss

Remove Send and Sync for Symbol
diff --git a/.travis.yml b/.travis.yml
index 5877ec5..ec82207 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,13 +7,15 @@
 before_script:
   - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
 script:
-  - cargo test
+  - travis-cargo build
+  - travis-cargo --only nightly test
   - cargo doc --no-deps
 after_success:
   - travis-cargo --only nightly doc-upload
 env:
   global:
-    secure: "NAsZghAVTAksrm4WP4I66VmD2wW0eRbwB+ZKHUQfvbgUaCRvVdp4WBbWXGU/f/yHgDFWZwljWR4iPMiBwAK8nZsQFRuLFdHrOOHqbkj639LLdT9A07s1zLMB1GfR1fDttzrGhm903pbT2yxSyqqpahGYM7TaGDYYmKYIk4XyVNA5F5Sk7RI+rCecKraoYDeUEFbjWWYtU2FkEXsELEKj0emX5reWkR+wja3QokFcRZ25+Zd2dRC0K8W5QcY2UokLzKncBMCTC5q70H616S3r/9qW67Si1njsJ7RzP0NlZQUNQ/VCvwr4LCr9w+AD9i1SZtXxuux77tWEWSJvBzUc82dDMUv/floJuF7HTulSxxQoRm+fbzpXj9mgaJNiUHXru6ZRTCRVRUSXpcAco94bVoy/jnjrTe3jgAIZK5w14zA8yLw1Jxof31DlbcWORxgF+6fnY2nKPRN2oiQ50+jm1AuGDZX59/wMiu1QlkjOBHtikHp+u+7mp3SkkM04DvuQ/tWODQQnOOtrA0EB3i5H1zeTSnUcmbJufUljWWOvF1QYII08MccqwfG1KWbpobvdu+cV2iVhkq/lNCEL3Ai101CnmSCnMz+9oK/XxYOrx2TnaD9ootOKgnk7XWxF19GZecQx6O2hHTouxvB/0KcRPGWmMWl0H88f3T/Obql8bG8="
+    - TRAVIS_CARGO_NIGHTLY_FEATURE=""
+    - secure: "NAsZghAVTAksrm4WP4I66VmD2wW0eRbwB+ZKHUQfvbgUaCRvVdp4WBbWXGU/f/yHgDFWZwljWR4iPMiBwAK8nZsQFRuLFdHrOOHqbkj639LLdT9A07s1zLMB1GfR1fDttzrGhm903pbT2yxSyqqpahGYM7TaGDYYmKYIk4XyVNA5F5Sk7RI+rCecKraoYDeUEFbjWWYtU2FkEXsELEKj0emX5reWkR+wja3QokFcRZ25+Zd2dRC0K8W5QcY2UokLzKncBMCTC5q70H616S3r/9qW67Si1njsJ7RzP0NlZQUNQ/VCvwr4LCr9w+AD9i1SZtXxuux77tWEWSJvBzUc82dDMUv/floJuF7HTulSxxQoRm+fbzpXj9mgaJNiUHXru6ZRTCRVRUSXpcAco94bVoy/jnjrTe3jgAIZK5w14zA8yLw1Jxof31DlbcWORxgF+6fnY2nKPRN2oiQ50+jm1AuGDZX59/wMiu1QlkjOBHtikHp+u+7mp3SkkM04DvuQ/tWODQQnOOtrA0EB3i5H1zeTSnUcmbJufUljWWOvF1QYII08MccqwfG1KWbpobvdu+cV2iVhkq/lNCEL3Ai101CnmSCnMz+9oK/XxYOrx2TnaD9ootOKgnk7XWxF19GZecQx6O2hHTouxvB/0KcRPGWmMWl0H88f3T/Obql8bG8="
 
 notifications:
   email:
diff --git a/Cargo.toml b/Cargo.toml
index 127d20d..9cf5c05 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,5 +9,8 @@
 [dependencies]
 unicode-xid = "0.0.4"
 
+[dev-dependencies]
+compiletest_rs = "0.2"
+
 [features]
 unstable = []
diff --git a/src/stable.rs b/src/stable.rs
index 0c0607a..26b2686 100644
--- a/src/stable.rs
+++ b/src/stable.rs
@@ -4,6 +4,7 @@
 use std::collections::HashMap;
 use std::fmt;
 use std::iter;
+use std::marker::PhantomData;
 use std::ops;
 use std::rc::Rc;
 use std::str::FromStr;
@@ -146,13 +147,19 @@
 }
 
 #[derive(Copy, Clone, Debug)]
-pub struct Symbol(usize);
+pub struct Symbol {
+    intern: usize,
+    not_send_sync: PhantomData<*const ()>,
+}
 
 thread_local!(static SYMBOLS: RefCell<Interner> = RefCell::new(Interner::new()));
 
 impl<'a> From<&'a str> for Symbol {
     fn from(string: &'a str) -> Symbol {
-        Symbol(SYMBOLS.with(|s| s.borrow_mut().intern(string)))
+        Symbol {
+            intern: SYMBOLS.with(|s| s.borrow_mut().intern(string)),
+            not_send_sync: PhantomData,
+        }
     }
 }
 
@@ -162,7 +169,7 @@
     fn deref(&self) -> &str {
         SYMBOLS.with(|interner| {
             let interner = interner.borrow();
-            let s = interner.get(self.0);
+            let s = interner.get(self.intern);
             unsafe {
                 &*(s as *const str)
             }
diff --git a/tests/compile-fail/symbol_send.rs b/tests/compile-fail/symbol_send.rs
new file mode 100644
index 0000000..64727fc
--- /dev/null
+++ b/tests/compile-fail/symbol_send.rs
@@ -0,0 +1,9 @@
+extern crate proc_macro2;
+
+use proc_macro2::Symbol;
+
+fn assert_send<T: Send>() {}
+
+fn main() {
+    assert_send::<Symbol>(); //~ the trait bound `*const (): std::marker::Send` is not satisfied in `proc_macro2::Symbol`
+}
diff --git a/tests/compile-fail/symbol_sync.rs b/tests/compile-fail/symbol_sync.rs
new file mode 100644
index 0000000..ede06d1
--- /dev/null
+++ b/tests/compile-fail/symbol_sync.rs
@@ -0,0 +1,9 @@
+extern crate proc_macro2;
+
+use proc_macro2::Symbol;
+
+fn assert_sync<T: Sync>() {}
+
+fn main() {
+    assert_sync::<Symbol>(); //~ the trait bound `*const (): std::marker::Sync` is not satisfied in `proc_macro2::Symbol`
+}
diff --git a/tests/compiletest.rs b/tests/compiletest.rs
new file mode 100644
index 0000000..b1055ce
--- /dev/null
+++ b/tests/compiletest.rs
@@ -0,0 +1,14 @@
+extern crate compiletest_rs as compiletest;
+
+fn run_mode(mode: &'static str) {
+    let mut config = compiletest::default_config();
+    config.mode = mode.parse().expect("invalid mode");
+    config.target_rustcflags = Some("-L target/debug/deps".to_owned());
+    config.src_base = format!("tests/{}", mode).into();
+    compiletest::run_tests(&config);
+}
+
+#[test]
+fn compile_fail() {
+    run_mode("compile-fail");
+}