Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang · rust-lang/rust@2cc5bf7 · GitHub
Skip to content

Commit 2cc5bf7

Browse files
authored
Rollup merge of #147421 - Kivooeo:ice-fix51621, r=chenyukang
Add check if span is from macro expansion The same thing I did in #147416, actually the same bug but in another place, I'm not really sure how this method is good for fixing such ICEs, but, it does work and not conflicting with any existing tests, so I guess, it's fine Fixes#147408 r? compiler
2 parents 847c422 + 47384f7 commit 2cc5bf7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

‎compiler/rustc_lint/src/shadowed_into_iter.rs‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
124124
return;
125125
};
126126

127+
// This check needs to avoid ICE from when `receiver_arg` is from macro expansion
128+
// Which leads to empty span in span arithmetic below
129+
// cc: https://github.com/rust-lang/rust/issues/147408
130+
let span = receiver_arg.span.find_ancestor_in_same_ctxt(expr.span);
131+
127132
// If this expression comes from the `IntoIter::into_iter` inside of a for loop,
128133
// we should just suggest removing the `.into_iter()` or changing it to `.iter()`
129134
// to disambiguate if we want to iterate by-value or by-ref.
@@ -134,14 +139,15 @@ impl<'tcx> LateLintPass<'tcx> for ShadowedIntoIter {
134139
&& let hir::ExprKind::Call(path,[_]) = &arg.kind
135140
&& let hir::ExprKind::Path(qpath) = path.kind
136141
&& cx.tcx.qpath_is_lang_item(qpath,LangItem::IntoIterIntoIter)
142+
&& letSome(span) = span
137143
{
138144
Some(ShadowedIntoIterDiagSub::RemoveIntoIter{
139-
span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145+
span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
140146
})
141-
}elseif can_suggest_ufcs {
147+
}elseif can_suggest_ufcs && letSome(span) = span {
142148
Some(ShadowedIntoIterDiagSub::UseExplicitIntoIter{
143149
start_span: expr.span.shrink_to_lo(),
144-
end_span:receiver_arg.span.shrink_to_hi().to(expr.span.shrink_to_hi()),
150+
end_span: span.shrink_to_hi().to(expr.span.shrink_to_hi()),
145151
})
146152
}else{
147153
None
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//@ check-pass
2+
//@ compile-flags: -Afor_loops_over_fallibles -Warray_into_iter
3+
4+
fnmain(){
5+
macro_rules! mac {
6+
(iter $e:expr) => {
7+
$e.iter()
8+
};
9+
(into_iter $e:expr) => {
10+
$e.into_iter()//~ WARN this method call resolves to
11+
//~^ WARN this changes meaning in Rust 2021
12+
};
13+
(next $e:expr) => {
14+
$e.iter().next()
15+
};
16+
}
17+
18+
for _ indbg!([1,2]).iter(){}
19+
for _ indbg!([1,2]).into_iter(){}//~ WARN this method call resolves to
20+
//~^ WARN this changes meaning in Rust 2021
21+
for _ inmac!(iter [1,2]){}
22+
for _ inmac!(into_iter [1,2]){}
23+
for _ inmac!(next [1,2]){}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
2+
--> $DIR/macro-expansion-empty-span-147408.rs:19:27
3+
|
4+
LL | for _ in dbg!([1, 2]).into_iter() {}
5+
| ^^^^^^^^^
6+
|
7+
= warning: this changes meaning in Rust 2021
8+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
9+
= note: requested on the command line with `-W array-into-iter`
10+
help: use `.iter()` instead of `.into_iter()` to avoid ambiguity
11+
|
12+
LL - for _ in dbg!([1, 2]).into_iter() {}
13+
LL + for _ in dbg!([1, 2]).iter() {}
14+
|
15+
help: or remove `.into_iter()` to iterate by value
16+
|
17+
LL - for _ in dbg!([1, 2]).into_iter() {}
18+
LL + for _ in dbg!([1, 2]) {}
19+
|
20+
21+
warning: this method call resolves to `<&[T; N] as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<[T; N] as IntoIterator>::into_iter` in Rust 2021
22+
--> $DIR/macro-expansion-empty-span-147408.rs:10:16
23+
|
24+
LL | $e.into_iter()
25+
| ^^^^^^^^^ help: use `.iter()` instead of `.into_iter()` to avoid ambiguity: `iter`
26+
...
27+
LL | for _ in mac!(into_iter [1, 2]) {}
28+
| ---------------------- in this macro invocation
29+
|
30+
= warning: this changes meaning in Rust 2021
31+
= note: for more information, see <https://doc.rust-lang.org/edition-guide/rust-2021/IntoIterator-for-arrays.html>
32+
= note: this warning originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
33+
34+
warning: 2 warnings emitted
35+

0 commit comments

Comments
 (0)