Skip to content

Commit ea34650

Browse files
committed
Auto merge of #142826 - jdonszelmann:rollup-1wxomvb, r=jdonszelmann
Rollup of 3 pull requests Successful merges: - #142539 (Port `#[may_dangle]` to the new attribute system) - #142690 (expand: Remove some unnecessary generic parameters) - #142698 (Improve diagnostics for `concat_bytes!` with C string literals) Failed merges: - #142600 (Port `#[rustc_pub_transparent]` to the new attribute system) - #142776 (All HIR attributes are outer) r? `@ghost` `@rustbot` modify labels: rollup
2 parents 6d0c9e2 + c693bc2 commit ea34650

File tree

12 files changed

+215
-88
lines changed

12 files changed

+215
-88
lines changed

compiler/rustc_attr_data_structures/src/attributes.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,13 @@ pub enum AttributeKind {
233233

234234
/// Represents `#[rustc_macro_transparency]`.
235235
MacroTransparency(Transparency),
236+
237+
/// Represents [`#[may_dangle]`](https://std-dev-guide.rust-lang.org/tricky/may-dangle.html).
238+
MayDangle(Span),
239+
236240
/// Represents `#[optimize(size|speed)]`
237241
Optimize(OptimizeAttr, Span),
242+
238243
/// Represents [`#[repr]`](https://doc.rust-lang.org/stable/reference/type-layout.html#representations).
239244
Repr(ThinVec<(ReprAttr, Span)>),
240245

compiler/rustc_attr_parsing/src/attributes/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub(crate) mod deprecation;
3434
pub(crate) mod inline;
3535
pub(crate) mod lint_helpers;
3636
pub(crate) mod repr;
37+
pub(crate) mod semantics;
3738
pub(crate) mod stability;
3839
pub(crate) mod transparency;
3940
pub(crate) mod util;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use rustc_attr_data_structures::AttributeKind;
2+
use rustc_feature::{AttributeTemplate, template};
3+
use rustc_span::{Symbol, sym};
4+
5+
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
6+
use crate::context::{AcceptContext, Stage};
7+
use crate::parser::ArgParser;
8+
9+
pub(crate) struct MayDangleParser;
10+
impl<S: Stage> SingleAttributeParser<S> for MayDangleParser {
11+
const PATH: &[Symbol] = &[sym::may_dangle];
12+
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepFirst;
13+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
14+
const TEMPLATE: AttributeTemplate = template!(Word);
15+
16+
fn convert(cx: &mut AcceptContext<'_, '_, S>, _args: &ArgParser<'_>) -> Option<AttributeKind> {
17+
Some(AttributeKind::MayDangle(cx.attr_span))
18+
}
19+
}

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::attributes::deprecation::DeprecationParser;
2121
use crate::attributes::inline::{InlineParser, RustcForceInlineParser};
2222
use crate::attributes::lint_helpers::AsPtrParser;
2323
use crate::attributes::repr::{AlignParser, ReprParser};
24+
use crate::attributes::semantics::MayDangleParser;
2425
use crate::attributes::stability::{
2526
BodyStabilityParser, ConstStabilityIndirectParser, ConstStabilityParser, StabilityParser,
2627
};
@@ -110,6 +111,7 @@ attribute_parsers!(
110111
Single<ConstStabilityIndirectParser>,
111112
Single<DeprecationParser>,
112113
Single<InlineParser>,
114+
Single<MayDangleParser>,
113115
Single<OptimizeParser>,
114116
Single<RustcForceInlineParser>,
115117
Single<TransparencyParser>,

compiler/rustc_builtin_macros/messages.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ builtin_macros_concat_bytes_bad_repeat = repeat count is not a positive number
104104
builtin_macros_concat_bytes_invalid = cannot concatenate {$lit_kind} literals
105105
.byte_char = try using a byte character
106106
.byte_str = try using a byte string
107+
.c_str = try using a null-terminated byte string
108+
.c_str_note = concatenating C strings is ambiguous about including the '\0'
107109
.number_array = try wrapping the number in an array
108110
109111
builtin_macros_concat_bytes_missing_literal = expected a byte literal

compiler/rustc_builtin_macros/src/concat_bytes.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_ast::ptr::P;
22
use rustc_ast::tokenstream::TokenStream;
3-
use rustc_ast::{ExprKind, LitIntType, LitKind, UintTy, token};
3+
use rustc_ast::{ExprKind, LitIntType, LitKind, StrStyle, UintTy, token};
44
use rustc_expand::base::{DummyResult, ExpandResult, ExtCtxt, MacEager, MacroExpanderResult};
55
use rustc_session::errors::report_lit_error;
66
use rustc_span::{ErrorGuaranteed, Span};
@@ -21,15 +21,32 @@ fn invalid_type_err(
2121
let snippet = cx.sess.source_map().span_to_snippet(span).ok();
2222
let dcx = cx.dcx();
2323
match LitKind::from_token_lit(token_lit) {
24-
Ok(LitKind::CStr(_, _)) => {
24+
Ok(LitKind::CStr(_, style)) => {
2525
// Avoid ambiguity in handling of terminal `NUL` by refusing to
2626
// concatenate C string literals as bytes.
27-
dcx.emit_err(errors::ConcatCStrLit { span })
27+
let sugg = if let Some(mut as_bstr) = snippet
28+
&& style == StrStyle::Cooked
29+
&& as_bstr.starts_with('c')
30+
&& as_bstr.ends_with('"')
31+
{
32+
// Suggest`c"foo"` -> `b"foo\0"` if we can
33+
as_bstr.replace_range(0..1, "b");
34+
as_bstr.pop();
35+
as_bstr.push_str(r#"\0""#);
36+
Some(ConcatBytesInvalidSuggestion::CStrLit { span, as_bstr })
37+
} else {
38+
// No suggestion for a missing snippet, raw strings, or if for some reason we have
39+
// a span that doesn't match `c"foo"` (possible if a proc macro assigns a span
40+
// that doesn't actually point to a C string).
41+
None
42+
};
43+
// We can only provide a suggestion if we have a snip and it is not a raw string
44+
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "C string", sugg, cs_note: Some(()) })
2845
}
2946
Ok(LitKind::Char(_)) => {
3047
let sugg =
3148
snippet.map(|snippet| ConcatBytesInvalidSuggestion::CharLit { span, snippet });
32-
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "character", sugg })
49+
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "character", sugg, cs_note: None })
3350
}
3451
Ok(LitKind::Str(_, _)) => {
3552
// suggestion would be invalid if we are nested
@@ -38,18 +55,21 @@ fn invalid_type_err(
3855
} else {
3956
None
4057
};
41-
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "string", sugg })
58+
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "string", sugg, cs_note: None })
4259
}
4360
Ok(LitKind::Float(_, _)) => {
44-
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "float", sugg: None })
45-
}
46-
Ok(LitKind::Bool(_)) => {
47-
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "boolean", sugg: None })
61+
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "float", sugg: None, cs_note: None })
4862
}
63+
Ok(LitKind::Bool(_)) => dcx.emit_err(ConcatBytesInvalid {
64+
span,
65+
lit_kind: "boolean",
66+
sugg: None,
67+
cs_note: None,
68+
}),
4969
Ok(LitKind::Int(_, _)) if !is_nested => {
5070
let sugg =
5171
snippet.map(|snippet| ConcatBytesInvalidSuggestion::IntLit { span, snippet });
52-
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "numeric", sugg })
72+
dcx.emit_err(ConcatBytesInvalid { span, lit_kind: "numeric", sugg, cs_note: None })
5373
}
5474
Ok(LitKind::Int(val, LitIntType::Unsuffixed | LitIntType::Unsigned(UintTy::U8))) => {
5575
assert!(val.get() > u8::MAX.into()); // must be an error

compiler/rustc_builtin_macros/src/errors.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ pub(crate) struct ConcatBytesInvalid {
215215
pub(crate) lit_kind: &'static str,
216216
#[subdiagnostic]
217217
pub(crate) sugg: Option<ConcatBytesInvalidSuggestion>,
218+
#[note(builtin_macros_c_str_note)]
219+
pub(crate) cs_note: Option<()>,
218220
}
219221

220222
#[derive(Subdiagnostic)]
@@ -239,6 +241,13 @@ pub(crate) enum ConcatBytesInvalidSuggestion {
239241
span: Span,
240242
snippet: String,
241243
},
244+
#[note(builtin_macros_c_str_note)]
245+
#[suggestion(builtin_macros_c_str, code = "{as_bstr}", applicability = "machine-applicable")]
246+
CStrLit {
247+
#[primary_span]
248+
span: Span,
249+
as_bstr: String,
250+
},
242251
#[suggestion(
243252
builtin_macros_number_array,
244253
code = "[{snippet}]",

0 commit comments

Comments
 (0)