about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2020-01-03 16:32:01 -0800
committerDylan MacKenzie <ecstaticmorse@gmail.com>2020-01-09 16:47:05 -0800
commit31edbe9acacceb24f0e31a73e0c45f852977c663 (patch)
tree9a88bfec4dbb721ccb1d5a7e78e373d63d6dddae
parentb390fc4cf1e7293716cd8d80ec532df232022324 (diff)
downloadrust-31edbe9acacceb24f0e31a73e0c45f852977c663.tar.gz
rust-31edbe9acacceb24f0e31a73e0c45f852977c663.zip
Reject `const` in inherent impls
-rw-r--r--src/librustc_parse/parser/item.rs15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/librustc_parse/parser/item.rs b/src/librustc_parse/parser/item.rs
index 86ab8bf57a3..b209e5a7826 100644
--- a/src/librustc_parse/parser/item.rs
+++ b/src/librustc_parse/parser/item.rs
@@ -5,7 +5,7 @@ use crate::maybe_whole;
 
 use rustc_error_codes::*;
 use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, PResult, StashKey};
-use rustc_span::source_map::{self, respan, Span};
+use rustc_span::source_map::{self, respan, Span, Spanned};
 use rustc_span::symbol::{kw, sym, Symbol};
 use rustc_span::BytePos;
 use syntax::ast::{self, AttrKind, AttrStyle, AttrVec, Attribute, Ident, DUMMY_NODE_ID};
@@ -560,8 +560,9 @@ impl<'a> Parser<'a> {
         };
 
         let constness = if self.eat_keyword(kw::Const) {
-            self.sess.gated_spans.gate(sym::const_trait_impl, self.prev_span);
-            Some(Constness::Const)
+            let span = self.prev_span;
+            self.sess.gated_spans.gate(sym::const_trait_impl, span);
+            Some(respan(span, Constness::Const))
         } else {
             None
         };
@@ -626,6 +627,7 @@ impl<'a> Parser<'a> {
                         err_path(ty_first.span)
                     }
                 };
+                let constness = constness.map(|c| c.node);
                 let trait_ref = TraitRef { path, constness, ref_id: ty_first.id };
 
                 ItemKind::Impl(
@@ -639,6 +641,13 @@ impl<'a> Parser<'a> {
                 )
             }
             None => {
+                // Reject `impl const Type {}` here
+                if let Some(Spanned { node: Constness::Const, span }) = constness {
+                    self.struct_span_err(span, "`const` cannot modify an inherent impl")
+                        .help("only a trait impl can be `const`")
+                        .emit();
+                }
+
                 // impl Type
                 ItemKind::Impl(
                     unsafety,