mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-12 20:16:49 +00:00
Stabilize macro_literal_matcher
This commit is contained in:
parent
910ec6d97f
commit
fc284c1eee
@ -1,17 +0,0 @@
|
||||
# `macro_literal_matcher`
|
||||
|
||||
The tracking issue for this feature is: [#35625]
|
||||
|
||||
The RFC is: [rfc#1576].
|
||||
|
||||
With this feature gate enabled, the [list of designators] gains one more entry:
|
||||
|
||||
* `literal`: a literal. Examples: 2, "string", 'c'
|
||||
|
||||
A `literal` may be followed by anything, similarly to the `ident` specifier.
|
||||
|
||||
[rfc#1576]: http://rust-lang.github.io/rfcs/1576-macros-literal-matcher.html
|
||||
[#35625]: https://github.com/rust-lang/rust/issues/35625
|
||||
[list of designators]: ../reference/macros-by-example.html
|
||||
|
||||
------------------------
|
@ -19,7 +19,7 @@ use ext::tt::macro_parser::{MatchedSeq, MatchedNonterminal};
|
||||
use ext::tt::macro_parser::{parse, parse_failure_msg};
|
||||
use ext::tt::quoted;
|
||||
use ext::tt::transcribe::transcribe;
|
||||
use feature_gate::{self, emit_feature_err, Features, GateIssue};
|
||||
use feature_gate::Features;
|
||||
use parse::{Directory, ParseSess};
|
||||
use parse::parser::Parser;
|
||||
use parse::token::{self, NtTT};
|
||||
@ -1027,26 +1027,21 @@ fn has_legal_fragment_specifier(sess: &ParseSess,
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn is_legal_fragment_specifier(sess: &ParseSess,
|
||||
features: &Features,
|
||||
attrs: &[ast::Attribute],
|
||||
fn is_legal_fragment_specifier(_sess: &ParseSess,
|
||||
_features: &Features,
|
||||
_attrs: &[ast::Attribute],
|
||||
frag_name: &str,
|
||||
frag_span: Span) -> bool {
|
||||
_frag_span: Span) -> bool {
|
||||
/*
|
||||
* If new fragmnet specifiers are invented in nightly, `_sess`,
|
||||
* `_features`, `_attrs`, and `_frag_span` will be useful for
|
||||
* here for checking against feature gates. See past versions of
|
||||
* this function.
|
||||
*/
|
||||
match frag_name {
|
||||
"item" | "block" | "stmt" | "expr" | "pat" | "lifetime" |
|
||||
"path" | "ty" | "ident" | "meta" | "tt" | "vis" | "" => true,
|
||||
"literal" => {
|
||||
if !features.macro_literal_matcher &&
|
||||
!attr::contains_name(attrs, "allow_internal_unstable") {
|
||||
let explain = feature_gate::EXPLAIN_LITERAL_MATCHER;
|
||||
emit_feature_err(sess,
|
||||
"macro_literal_matcher",
|
||||
frag_span,
|
||||
GateIssue::Language,
|
||||
explain);
|
||||
}
|
||||
true
|
||||
},
|
||||
"path" | "ty" | "ident" | "meta" | "tt" | "vis" | "literal" |
|
||||
"" => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
@ -436,9 +436,6 @@ declare_features! (
|
||||
// Allows irrefutable patterns in if-let and while-let statements (RFC 2086)
|
||||
(active, irrefutable_let_patterns, "1.27.0", Some(44495), None),
|
||||
|
||||
// Allows use of the :literal macro fragment specifier (RFC 1576)
|
||||
(active, macro_literal_matcher, "1.27.0", Some(35625), None),
|
||||
|
||||
// inconsistent bounds in where clauses
|
||||
(active, trivial_bounds, "1.28.0", Some(48214), None),
|
||||
|
||||
@ -690,6 +687,8 @@ declare_features! (
|
||||
(accepted, impl_header_lifetime_elision, "1.31.0", Some(15872), None),
|
||||
// `extern crate foo as bar;` puts `bar` into extern prelude.
|
||||
(accepted, extern_crate_item_prelude, "1.31.0", Some(55599), None),
|
||||
// Allows use of the :literal macro fragment specifier (RFC 1576)
|
||||
(accepted, macro_literal_matcher, "1.31.0", Some(35625), None),
|
||||
);
|
||||
|
||||
// If you change this, please modify src/doc/unstable-book as well. You must
|
||||
@ -1425,9 +1424,6 @@ pub const EXPLAIN_DEPR_CUSTOM_DERIVE: &'static str =
|
||||
pub const EXPLAIN_DERIVE_UNDERSCORE: &'static str =
|
||||
"attributes of the form `#[derive_*]` are reserved for the compiler";
|
||||
|
||||
pub const EXPLAIN_LITERAL_MATCHER: &'static str =
|
||||
":literal fragment specifier is experimental and subject to change";
|
||||
|
||||
pub const EXPLAIN_UNSIZED_TUPLE_COERCION: &'static str =
|
||||
"unsized tuple coercion is not stable enough for use and is subject to change";
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
// except according to those terms.
|
||||
|
||||
// run-pass
|
||||
#![feature(macro_literal_matcher)]
|
||||
#![cfg_attr(stage0, feature(macro_literal_matcher))]
|
||||
|
||||
macro_rules! a {
|
||||
($i:literal) => { "right" };
|
||||
|
@ -9,7 +9,7 @@
|
||||
// except according to those terms.
|
||||
|
||||
// run-pass
|
||||
#![feature(macro_literal_matcher)]
|
||||
#![cfg_attr(stage0, feature(macro_literal_matcher))]
|
||||
|
||||
macro_rules! mtester {
|
||||
($l:literal) => {
|
||||
|
@ -1,19 +0,0 @@
|
||||
// Copyright 2018 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.
|
||||
|
||||
// Test that the :lifetime macro fragment cannot be used when macro_lifetime_matcher
|
||||
// feature gate is not used.
|
||||
|
||||
macro_rules! m { ($lt:literal) => {} }
|
||||
//~^ ERROR :literal fragment specifier is experimental and subject to change
|
||||
|
||||
fn main() {
|
||||
m!("some string literal");
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
error[E0658]: :literal fragment specifier is experimental and subject to change (see issue #35625)
|
||||
--> $DIR/feature-gate-macro-literal-matcher.rs:14:19
|
||||
|
|
||||
LL | macro_rules! m { ($lt:literal) => {} }
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: add #![feature(macro_literal_matcher)] to the crate attributes to enable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
Loading…
Reference in New Issue
Block a user