]> git.lizzy.rs Git - rust.git/commitdiff
Prohibit parenthesized params in bounds etc.
authorMasaki Hara <ackie.h.gmai@gmail.com>
Mon, 15 May 2017 06:21:01 +0000 (15:21 +0900)
committerMasaki Hara <ackie.h.gmai@gmail.com>
Mon, 15 May 2017 06:21:01 +0000 (15:21 +0900)
src/librustc_typeck/astconv.rs
src/librustc_typeck/check/mod.rs
src/test/compile-fail/issue-32995-2.rs [new file with mode: 0644]
src/test/compile-fail/issue-32995.rs

index 93411493b178f41864d714416a265c520fd551dd..d8a3ebe063a4560f3ec56e8321bd74591c2d4ca5 100644 (file)
@@ -372,6 +372,8 @@ pub fn instantiate_mono_trait_ref(&self,
         self_ty: Ty<'tcx>)
         -> ty::TraitRef<'tcx>
     {
+        self.prohibit_type_params(trait_ref.path.segments.split_last().unwrap().1);
+
         let trait_def_id = self.trait_def_id(trait_ref);
         self.ast_path_to_mono_trait_ref(trait_ref.path.span,
                                         trait_def_id,
@@ -404,6 +406,8 @@ pub fn instantiate_poly_trait_ref(&self,
 
         debug!("ast_path_to_poly_trait_ref({:?}, def_id={:?})", trait_ref, trait_def_id);
 
+        self.prohibit_type_params(trait_ref.path.segments.split_last().unwrap().1);
+
         let (substs, assoc_bindings) =
             self.create_substs_for_ast_trait_ref(trait_ref.path.span,
                                                  trait_def_id,
@@ -625,6 +629,13 @@ fn conv_object_ty_poly_trait_ref(&self,
                                                         dummy_self,
                                                         &mut projection_bounds);
 
+        for trait_bound in trait_bounds[1..].iter() {
+            // Sanity check for non-principal trait bounds
+            self.instantiate_poly_trait_ref(trait_bound,
+                                            dummy_self,
+                                            &mut vec![]);
+        }
+
         let (auto_traits, trait_bounds) = split_auto_traits(tcx, &trait_bounds[1..]);
 
         if !trait_bounds.is_empty() {
index 127ffc60cf4dd90ae66c0a0eccaa35ab19aaff6d..05594cff8a02e2c1cb26894c2cd9c742534fe21d 100644 (file)
@@ -4495,7 +4495,8 @@ fn check_path_parameter_count(&self,
                     (&data.lifetimes[..], &data.types[..], data.infer_types, &data.bindings[..])
                 }
                 Some(&hir::ParenthesizedParameters(_)) => {
-                    span_bug!(span, "parenthesized parameters cannot appear in ExprPath");
+                    AstConv::prohibit_parenthesized_params(self, &segment.as_ref().unwrap().0);
+                    (&[][..], &[][..], true, &[][..])
                 }
                 None => (&[][..], &[][..], true, &[][..])
             }
diff --git a/src/test/compile-fail/issue-32995-2.rs b/src/test/compile-fail/issue-32995-2.rs
new file mode 100644 (file)
index 0000000..80113d3
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright 2017 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.
+
+#![feature(conservative_impl_trait)]
+
+fn main() {
+    { fn f<X: ::std::marker()::Send>() {} }
+    //~^ ERROR parenthesized parameters may only be used with a trait
+
+    { fn f() -> impl ::std::marker()::Send { } }
+    //~^ ERROR parenthesized parameters may only be used with a trait
+}
+
+#[derive(Clone)]
+struct X;
+
+impl ::std::marker()::Copy for X {}
+//~^ ERROR parenthesized parameters may only be used with a trait
index 2fb22e68bebdb7346966dc5d4fba652308edb3a9..d38bec455134e896ae7a4870ee164db6ef43f27d 100644 (file)
@@ -17,6 +17,22 @@ fn main() {
 
     let b: ::std::boxed()::Box<_> = Box::new(1);
     //~^ ERROR parenthesized parameters may only be used with a trait
+
+    macro_rules! pathexpr {
+        ($p:path) => { $p }
+    }
+
+    let p = pathexpr!(::std::str()::from_utf8)(b"foo").unwrap();
+    //~^ ERROR parenthesized parameters may only be used with a trait
+
+    let p = pathexpr!(::std::str::from_utf8())(b"foo").unwrap();
+    //~^ ERROR parenthesized parameters may only be used with a trait
+
+    let o : Box<::std::marker()::Send> = Box::new(1);
+    //~^ ERROR parenthesized parameters may only be used with a trait
+
+    let o : Box<Send + ::std::marker()::Sync> = Box::new(1);
+    //~^ ERROR parenthesized parameters may only be used with a trait
 }
 
 fn foo<X:Default>() {