about summary refs log tree commit diff
diff options
context:
space:
mode:
authorwickerwaka <martin.donlon@gmail.com>2014-08-29 19:24:06 -0700
committerwickerwaka <martin.donlon@gmail.com>2014-08-29 19:27:27 -0700
commitf5776f81fd69cfe73de2806b31ef04215501fb0c (patch)
tree383ecc0bd6e657f8e0e96831195e0981a6a18389
parent5419b2ca2c27b4745fa1f2773719350420542c76 (diff)
downloadrust-f5776f81fd69cfe73de2806b31ef04215501fb0c.tar.gz
rust-f5776f81fd69cfe73de2806b31ef04215501fb0c.zip
Detect a traits being used as structs in check_expr_with_unifier
Fixes #16750
Fixes #15812
-rw-r--r--src/librustc/diagnostics.rs3
-rw-r--r--src/librustc/middle/typeck/check/mod.rs41
2 files changed, 32 insertions, 12 deletions
diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs
index 0c9260bdc7d..dce5dbbb239 100644
--- a/src/librustc/diagnostics.rs
+++ b/src/librustc/diagnostics.rs
@@ -169,5 +169,6 @@ register_diagnostics!(
     E0155,
     E0156,
     E0157,
-    E0158
+    E0158,
+    E0159
 )
diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs
index cfd2ee2b441..d26aa2be0a4 100644
--- a/src/librustc/middle/typeck/check/mod.rs
+++ b/src/librustc/middle/typeck/check/mod.rs
@@ -3463,6 +3463,22 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
         fcx.write_ty(id, enum_type);
     }
 
+    fn check_struct_fields_on_error(fcx: &FnCtxt,
+                                    id: ast::NodeId,
+                                    fields: &[ast::Field],
+                                    base_expr: Option<Gc<ast::Expr>>) {
+        // Make sure to still write the types
+        // otherwise we might ICE
+        fcx.write_error(id);
+        for field in fields.iter() {
+            check_expr(fcx, &*field.expr);
+        }
+        match base_expr {
+            Some(ref base) => check_expr(fcx, &**base),
+            None => {}
+        }
+    }
+
     type ExprCheckerWithTy = fn(&FnCtxt, &ast::Expr, ty::t);
 
     let tcx = fcx.ccx.tcx;
@@ -3982,6 +3998,16 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
                                           variant_id, fields.as_slice());
                 enum_id
             }
+            Some(def::DefTrait(def_id)) => {
+                span_err!(tcx.sess, path.span, E0159,
+                    "`{}` is a trait not a structure",
+                    pprust::path_to_string(path));
+                check_struct_fields_on_error(fcx,
+                                             id,
+                                             fields.as_slice(),
+                                             base_expr);
+                def_id
+            },
             Some(def) => {
                 // Verify that this was actually a struct.
                 let typ = ty::lookup_item_type(fcx.ccx.tcx, def.def_id());
@@ -3998,17 +4024,10 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
                         span_err!(tcx.sess, path.span, E0071,
                             "`{}` does not name a structure",
                             pprust::path_to_string(path));
-
-                        // Make sure to still write the types
-                        // otherwise we might ICE
-                        fcx.write_error(id);
-                        for field in fields.iter() {
-                            check_expr(fcx, &*field.expr);
-                        }
-                        match base_expr {
-                            Some(ref base) => check_expr(fcx, &**base),
-                            None => {}
-                        }
+                        check_struct_fields_on_error(fcx,
+                                                     id,
+                                                     fields.as_slice(),
+                                                     base_expr);
                     }
                 }