compiletest: Support matching on diagnostics without a span
This commit is contained in:
parent
7d49ae9731
commit
8d5109aa6e
116 changed files with 371 additions and 105 deletions
|
|
@ -202,6 +202,9 @@ several ways to match the message with the line (see the examples below):
|
||||||
* `~|`: Associates the error level and message with the *same* line as the
|
* `~|`: Associates the error level and message with the *same* line as the
|
||||||
*previous comment*. This is more convenient than using multiple carets when
|
*previous comment*. This is more convenient than using multiple carets when
|
||||||
there are multiple messages associated with the same line.
|
there are multiple messages associated with the same line.
|
||||||
|
* `~?`: Used to match error levels and messages with errors not having line
|
||||||
|
information. These can be placed on any line in the test file, but are
|
||||||
|
conventionally placed at the end.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
@ -270,10 +273,23 @@ fn main() {
|
||||||
//~| ERROR this pattern has 1 field, but the corresponding tuple struct has 3 fields [E0023]
|
//~| ERROR this pattern has 1 field, but the corresponding tuple struct has 3 fields [E0023]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Error without line information
|
||||||
|
|
||||||
|
Use `//~?` to match an error without line information.
|
||||||
|
`//~?` is precise and will not match errors if their line information is available.
|
||||||
|
It should be preferred to using `error-pattern`, which is imprecise and non-exhaustive.
|
||||||
|
|
||||||
|
```rust,ignore
|
||||||
|
//@ compile-flags: --print yyyy
|
||||||
|
|
||||||
|
//~? ERROR unknown print request: `yyyy`
|
||||||
|
```
|
||||||
|
|
||||||
### `error-pattern`
|
### `error-pattern`
|
||||||
|
|
||||||
The `error-pattern` [directive](directives.md) can be used for messages that don't
|
The `error-pattern` [directive](directives.md) can be used for runtime messages, which don't
|
||||||
have a specific span.
|
have a specific span, or for compile time messages if imprecise matching is required due to
|
||||||
|
multi-line platform specific diagnostics.
|
||||||
|
|
||||||
Let's think about this test:
|
Let's think about this test:
|
||||||
|
|
||||||
|
|
@ -300,7 +316,9 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
But for strict testing, try to use the `ERROR` annotation as much as possible.
|
But for strict testing, try to use the `ERROR` annotation as much as possible,
|
||||||
|
including `//~?` annotations for diagnostics without span.
|
||||||
|
For compile time diagnostics `error-pattern` should very rarely be necessary.
|
||||||
|
|
||||||
### Error levels
|
### Error levels
|
||||||
|
|
||||||
|
|
@ -353,7 +371,7 @@ would be a `.mir.stderr` and `.thir.stderr` file with the different outputs of
|
||||||
the different revisions.
|
the different revisions.
|
||||||
|
|
||||||
> Note: cfg revisions also work inside the source code with `#[cfg]` attributes.
|
> Note: cfg revisions also work inside the source code with `#[cfg]` attributes.
|
||||||
>
|
>
|
||||||
> By convention, the `FALSE` cfg is used to have an always-false config.
|
> By convention, the `FALSE` cfg is used to have an always-false config.
|
||||||
|
|
||||||
## Controlling pass/fail expectations
|
## Controlling pass/fail expectations
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,6 @@ use std::sync::OnceLock;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use tracing::*;
|
use tracing::*;
|
||||||
|
|
||||||
use self::WhichLine::*;
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||||
pub enum ErrorKind {
|
pub enum ErrorKind {
|
||||||
Help,
|
Help,
|
||||||
|
|
@ -50,7 +48,7 @@ impl fmt::Display for ErrorKind {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Error {
|
pub struct Error {
|
||||||
pub line_num: usize,
|
pub line_num: Option<usize>,
|
||||||
/// What kind of message we expect (e.g., warning, error, suggestion).
|
/// What kind of message we expect (e.g., warning, error, suggestion).
|
||||||
/// `None` if not specified or unknown message kind.
|
/// `None` if not specified or unknown message kind.
|
||||||
pub kind: Option<ErrorKind>,
|
pub kind: Option<ErrorKind>,
|
||||||
|
|
@ -63,17 +61,14 @@ impl Error {
|
||||||
format!(
|
format!(
|
||||||
"{: <10}line {: >3}: {}",
|
"{: <10}line {: >3}: {}",
|
||||||
self.kind.map(|kind| kind.to_string()).unwrap_or_default().to_uppercase(),
|
self.kind.map(|kind| kind.to_string()).unwrap_or_default().to_uppercase(),
|
||||||
self.line_num,
|
self.line_num_str(),
|
||||||
self.msg.cyan(),
|
self.msg.cyan(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
pub fn line_num_str(&self) -> String {
|
||||||
enum WhichLine {
|
self.line_num.map_or("?".to_string(), |line_num| line_num.to_string())
|
||||||
ThisLine,
|
}
|
||||||
FollowPrevious(usize),
|
|
||||||
AdjustBackward(usize),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Looks for either "//~| KIND MESSAGE" or "//~^^... KIND MESSAGE"
|
/// Looks for either "//~| KIND MESSAGE" or "//~^^... KIND MESSAGE"
|
||||||
|
|
@ -105,12 +100,10 @@ pub fn load_errors(testfile: &Path, revision: Option<&str>) -> Vec<Error> {
|
||||||
.filter(|(_, line)| line.is_ok())
|
.filter(|(_, line)| line.is_ok())
|
||||||
.filter_map(|(line_num, line)| {
|
.filter_map(|(line_num, line)| {
|
||||||
parse_expected(last_nonfollow_error, line_num + 1, &line.unwrap(), revision).map(
|
parse_expected(last_nonfollow_error, line_num + 1, &line.unwrap(), revision).map(
|
||||||
|(which, error)| {
|
|(follow_prev, error)| {
|
||||||
match which {
|
if !follow_prev {
|
||||||
FollowPrevious(_) => {}
|
last_nonfollow_error = error.line_num;
|
||||||
_ => last_nonfollow_error = Some(error.line_num),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
error
|
error
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
@ -123,18 +116,19 @@ fn parse_expected(
|
||||||
line_num: usize,
|
line_num: usize,
|
||||||
line: &str,
|
line: &str,
|
||||||
test_revision: Option<&str>,
|
test_revision: Option<&str>,
|
||||||
) -> Option<(WhichLine, Error)> {
|
) -> Option<(bool, Error)> {
|
||||||
// Matches comments like:
|
// Matches comments like:
|
||||||
// //~
|
// //~
|
||||||
// //~|
|
// //~|
|
||||||
// //~^
|
// //~^
|
||||||
// //~^^^^^
|
// //~^^^^^
|
||||||
|
// //~?
|
||||||
// //[rev1]~
|
// //[rev1]~
|
||||||
// //[rev1,rev2]~^^
|
// //[rev1,rev2]~^^
|
||||||
static RE: OnceLock<Regex> = OnceLock::new();
|
static RE: OnceLock<Regex> = OnceLock::new();
|
||||||
|
|
||||||
let captures = RE
|
let captures = RE
|
||||||
.get_or_init(|| Regex::new(r"//(?:\[(?P<revs>[\w\-,]+)])?~(?P<adjust>\||\^*)").unwrap())
|
.get_or_init(|| Regex::new(r"//(?:\[(?P<revs>[\w\-,]+)])?~(?P<adjust>\?|\||\^*)").unwrap())
|
||||||
.captures(line)?;
|
.captures(line)?;
|
||||||
|
|
||||||
match (test_revision, captures.name("revs")) {
|
match (test_revision, captures.name("revs")) {
|
||||||
|
|
@ -151,11 +145,6 @@ fn parse_expected(
|
||||||
(Some(_), None) | (None, None) => {}
|
(Some(_), None) | (None, None) => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
let (follow, adjusts) = match &captures["adjust"] {
|
|
||||||
"|" => (true, 0),
|
|
||||||
circumflexes => (false, circumflexes.len()),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get the part of the comment after the sigil (e.g. `~^^` or ~|).
|
// Get the part of the comment after the sigil (e.g. `~^^` or ~|).
|
||||||
let whole_match = captures.get(0).unwrap();
|
let whole_match = captures.get(0).unwrap();
|
||||||
let (_, mut msg) = line.split_at(whole_match.end());
|
let (_, mut msg) = line.split_at(whole_match.end());
|
||||||
|
|
@ -170,28 +159,24 @@ fn parse_expected(
|
||||||
|
|
||||||
let msg = msg.trim().to_owned();
|
let msg = msg.trim().to_owned();
|
||||||
|
|
||||||
let (which, line_num) = if follow {
|
let line_num_adjust = &captures["adjust"];
|
||||||
assert_eq!(adjusts, 0, "use either //~| or //~^, not both.");
|
let (follow_prev, line_num) = if line_num_adjust == "|" {
|
||||||
let line_num = last_nonfollow_error.expect(
|
(true, Some(last_nonfollow_error.expect("encountered //~| without preceding //~^ line")))
|
||||||
"encountered //~| without \
|
} else if line_num_adjust == "?" {
|
||||||
preceding //~^ line.",
|
(false, None)
|
||||||
);
|
|
||||||
(FollowPrevious(line_num), line_num)
|
|
||||||
} else {
|
} else {
|
||||||
let which = if adjusts > 0 { AdjustBackward(adjusts) } else { ThisLine };
|
(false, Some(line_num - line_num_adjust.len()))
|
||||||
let line_num = line_num - adjusts;
|
|
||||||
(which, line_num)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
"line={} tag={:?} which={:?} kind={:?} msg={:?}",
|
"line={:?} tag={:?} follow_prev={:?} kind={:?} msg={:?}",
|
||||||
line_num,
|
line_num,
|
||||||
whole_match.as_str(),
|
whole_match.as_str(),
|
||||||
which,
|
follow_prev,
|
||||||
kind,
|
kind,
|
||||||
msg
|
msg
|
||||||
);
|
);
|
||||||
Some((which, Error { line_num, kind, msg }))
|
Some((follow_prev, Error { line_num, kind, msg }))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use std::sync::OnceLock;
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
|
|
||||||
use crate::errors::{Error, ErrorKind};
|
use crate::errors::{Error, ErrorKind};
|
||||||
|
|
@ -213,36 +215,24 @@ fn push_expected_errors(
|
||||||
// also ensure that `//~ ERROR E123` *always* works. The
|
// also ensure that `//~ ERROR E123` *always* works. The
|
||||||
// assumption is that these multi-line error messages are on their
|
// assumption is that these multi-line error messages are on their
|
||||||
// way out anyhow.
|
// way out anyhow.
|
||||||
let with_code = |span: &DiagnosticSpan, text: &str| {
|
let with_code = |span: Option<&DiagnosticSpan>, text: &str| {
|
||||||
match diagnostic.code {
|
// FIXME(#33000) -- it'd be better to use a dedicated
|
||||||
Some(ref code) =>
|
// UI harness than to include the line/col number like
|
||||||
// FIXME(#33000) -- it'd be better to use a dedicated
|
// this, but some current tests rely on it.
|
||||||
// UI harness than to include the line/col number like
|
//
|
||||||
// this, but some current tests rely on it.
|
// Note: Do NOT include the filename. These can easily
|
||||||
//
|
// cause false matches where the expected message
|
||||||
// Note: Do NOT include the filename. These can easily
|
// appears in the filename, and hence the message
|
||||||
// cause false matches where the expected message
|
// changes but the test still passes.
|
||||||
// appears in the filename, and hence the message
|
let span_str = match span {
|
||||||
// changes but the test still passes.
|
Some(DiagnosticSpan { line_start, column_start, line_end, column_end, .. }) => {
|
||||||
{
|
format!("{line_start}:{column_start}: {line_end}:{column_end}")
|
||||||
format!(
|
|
||||||
"{}:{}: {}:{}: {} [{}]",
|
|
||||||
span.line_start,
|
|
||||||
span.column_start,
|
|
||||||
span.line_end,
|
|
||||||
span.column_end,
|
|
||||||
text,
|
|
||||||
code.code.clone()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
None =>
|
|
||||||
// FIXME(#33000) -- it'd be better to use a dedicated UI harness
|
|
||||||
{
|
|
||||||
format!(
|
|
||||||
"{}:{}: {}:{}: {}",
|
|
||||||
span.line_start, span.column_start, span.line_end, span.column_end, text
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
None => format!("?:?: ?:?"),
|
||||||
|
};
|
||||||
|
match &diagnostic.code {
|
||||||
|
Some(code) => format!("{span_str}: {text} [{}]", code.code),
|
||||||
|
None => format!("{span_str}: {text}"),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -251,19 +241,41 @@ fn push_expected_errors(
|
||||||
// more structured shortly anyhow.
|
// more structured shortly anyhow.
|
||||||
let mut message_lines = diagnostic.message.lines();
|
let mut message_lines = diagnostic.message.lines();
|
||||||
if let Some(first_line) = message_lines.next() {
|
if let Some(first_line) = message_lines.next() {
|
||||||
for span in primary_spans {
|
let ignore = |s| {
|
||||||
let msg = with_code(span, first_line);
|
static RE: OnceLock<Regex> = OnceLock::new();
|
||||||
|
RE.get_or_init(|| {
|
||||||
|
Regex::new(r"aborting due to \d+ previous errors?|\d+ warnings? emitted").unwrap()
|
||||||
|
})
|
||||||
|
.is_match(s)
|
||||||
|
};
|
||||||
|
|
||||||
|
if primary_spans.is_empty() && !ignore(first_line) {
|
||||||
|
let msg = with_code(None, first_line);
|
||||||
let kind = ErrorKind::from_str(&diagnostic.level).ok();
|
let kind = ErrorKind::from_str(&diagnostic.level).ok();
|
||||||
expected_errors.push(Error { line_num: span.line_start, kind, msg });
|
expected_errors.push(Error { line_num: None, kind, msg });
|
||||||
|
} else {
|
||||||
|
for span in primary_spans {
|
||||||
|
let msg = with_code(Some(span), first_line);
|
||||||
|
let kind = ErrorKind::from_str(&diagnostic.level).ok();
|
||||||
|
expected_errors.push(Error { line_num: Some(span.line_start), kind, msg });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for next_line in message_lines {
|
for next_line in message_lines {
|
||||||
for span in primary_spans {
|
if primary_spans.is_empty() {
|
||||||
expected_errors.push(Error {
|
expected_errors.push(Error {
|
||||||
line_num: span.line_start,
|
line_num: None,
|
||||||
kind: None,
|
kind: None,
|
||||||
msg: with_code(span, next_line),
|
msg: with_code(None, next_line),
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
for span in primary_spans {
|
||||||
|
expected_errors.push(Error {
|
||||||
|
line_num: Some(span.line_start),
|
||||||
|
kind: None,
|
||||||
|
msg: with_code(Some(span), next_line),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -272,7 +284,7 @@ fn push_expected_errors(
|
||||||
if let Some(ref suggested_replacement) = span.suggested_replacement {
|
if let Some(ref suggested_replacement) = span.suggested_replacement {
|
||||||
for (index, line) in suggested_replacement.lines().enumerate() {
|
for (index, line) in suggested_replacement.lines().enumerate() {
|
||||||
expected_errors.push(Error {
|
expected_errors.push(Error {
|
||||||
line_num: span.line_start + index,
|
line_num: Some(span.line_start + index),
|
||||||
kind: Some(ErrorKind::Suggestion),
|
kind: Some(ErrorKind::Suggestion),
|
||||||
msg: line.to_string(),
|
msg: line.to_string(),
|
||||||
});
|
});
|
||||||
|
|
@ -290,7 +302,7 @@ fn push_expected_errors(
|
||||||
// Add notes for any labels that appear in the message.
|
// Add notes for any labels that appear in the message.
|
||||||
for span in spans_in_this_file.iter().filter(|span| span.label.is_some()) {
|
for span in spans_in_this_file.iter().filter(|span| span.label.is_some()) {
|
||||||
expected_errors.push(Error {
|
expected_errors.push(Error {
|
||||||
line_num: span.line_start,
|
line_num: Some(span.line_start),
|
||||||
kind: Some(ErrorKind::Note),
|
kind: Some(ErrorKind::Note),
|
||||||
msg: span.label.clone().unwrap(),
|
msg: span.label.clone().unwrap(),
|
||||||
});
|
});
|
||||||
|
|
@ -309,7 +321,7 @@ fn push_backtrace(
|
||||||
) {
|
) {
|
||||||
if Path::new(&expansion.span.file_name) == Path::new(&file_name) {
|
if Path::new(&expansion.span.file_name) == Path::new(&file_name) {
|
||||||
expected_errors.push(Error {
|
expected_errors.push(Error {
|
||||||
line_num: expansion.span.line_start,
|
line_num: Some(expansion.span.line_start),
|
||||||
kind: Some(ErrorKind::Note),
|
kind: Some(ErrorKind::Note),
|
||||||
msg: format!("in this expansion of {}", expansion.macro_decl_name),
|
msg: format!("in this expansion of {}", expansion.macro_decl_name),
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -747,7 +747,7 @@ impl<'test> TestCx<'test> {
|
||||||
self.error(&format!(
|
self.error(&format!(
|
||||||
"{}:{}: unexpected {}: '{}'",
|
"{}:{}: unexpected {}: '{}'",
|
||||||
file_name,
|
file_name,
|
||||||
actual_error.line_num,
|
actual_error.line_num_str(),
|
||||||
actual_error
|
actual_error
|
||||||
.kind
|
.kind
|
||||||
.as_ref()
|
.as_ref()
|
||||||
|
|
@ -767,7 +767,7 @@ impl<'test> TestCx<'test> {
|
||||||
self.error(&format!(
|
self.error(&format!(
|
||||||
"{}:{}: expected {} not found: {}",
|
"{}:{}: expected {} not found: {}",
|
||||||
file_name,
|
file_name,
|
||||||
expected_error.line_num,
|
expected_error.line_num_str(),
|
||||||
expected_error.kind.as_ref().map_or("message".into(), |k| k.to_string()),
|
expected_error.kind.as_ref().map_or("message".into(), |k| k.to_string()),
|
||||||
expected_error.msg
|
expected_error.msg
|
||||||
));
|
));
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ impl TestCx<'_> {
|
||||||
} else if explicit && !expected_errors.is_empty() {
|
} else if explicit && !expected_errors.is_empty() {
|
||||||
let msg = format!(
|
let msg = format!(
|
||||||
"line {}: cannot combine `--error-format` with {} annotations; use `error-pattern` instead",
|
"line {}: cannot combine `--error-format` with {} annotations; use `error-pattern` instead",
|
||||||
expected_errors[0].line_num,
|
expected_errors[0].line_num_str(),
|
||||||
expected_errors[0].kind.unwrap_or(ErrorKind::Error),
|
expected_errors[0].kind.unwrap_or(ErrorKind::Error),
|
||||||
);
|
);
|
||||||
self.fatal(&msg);
|
self.fatal(&msg);
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
|
|
||||||
/// Foo
|
/// Foo
|
||||||
pub struct Xo;
|
pub struct Xo;
|
||||||
|
|
||||||
|
//~? ERROR `--output-format=html` is not supported for the `--show-coverage` option
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,7 @@
|
||||||
//~| NOTE see issue #44136
|
//~| NOTE see issue #44136
|
||||||
//~| NOTE no longer functions
|
//~| NOTE no longer functions
|
||||||
//~| NOTE `doc(plugins)` is now a no-op
|
//~| NOTE `doc(plugins)` is now a no-op
|
||||||
|
|
||||||
|
//~? WARN the `passes` flag no longer functions
|
||||||
|
//~? NOTE see issue #44136
|
||||||
|
//~? HELP you may want to use --document-private-items
|
||||||
|
|
|
||||||
|
|
@ -1 +1,3 @@
|
||||||
//@ compile-flags:-Z unstable-options --show-coverage --output-format=doctest
|
//@ compile-flags:-Z unstable-options --show-coverage --output-format=doctest
|
||||||
|
|
||||||
|
//~? ERROR `--output-format=doctest` is not supported for the `--show-coverage` option
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,5 @@
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
pub fn f() {}
|
pub fn f() {}
|
||||||
|
|
||||||
|
//~? WARN `--generate-link-to-definition` option can only be used with HTML output format
|
||||||
|
|
|
||||||
|
|
@ -13,3 +13,5 @@
|
||||||
|
|
||||||
#![deny(rustdoc::bare_urls)]
|
#![deny(rustdoc::bare_urls)]
|
||||||
#![doc=include_str!("auxiliary/include-str-bare-urls.md")]
|
#![doc=include_str!("auxiliary/include-str-bare-urls.md")]
|
||||||
|
|
||||||
|
//~? ERROR this URL is not a hyperlink
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,5 @@
|
||||||
pub fn foo() {}
|
pub fn foo() {}
|
||||||
//~^ WARN
|
//~^ WARN
|
||||||
//~^^ WARN
|
//~^^ WARN
|
||||||
|
|
||||||
|
//~? WARN no documentation found for this crate's top-level module
|
||||||
|
|
|
||||||
|
|
@ -8,3 +8,5 @@
|
||||||
|
|
||||||
/// </script>
|
/// </script>
|
||||||
pub struct Bar;
|
pub struct Bar;
|
||||||
|
|
||||||
|
//~? ERROR unopened HTML tag `script`
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,5 @@ pub fn foo() {
|
||||||
INVALID_FUNC();
|
INVALID_FUNC();
|
||||||
//~^ ERROR could not resolve path
|
//~^ ERROR could not resolve path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR Compilation failed, aborting rustdoc
|
||||||
|
|
|
||||||
|
|
@ -1 +1,3 @@
|
||||||
//@ compile-flags: -Z unstable-options --scrape-examples-target-crate foobar
|
//@ compile-flags: -Z unstable-options --scrape-examples-target-crate foobar
|
||||||
|
|
||||||
|
//~? ERROR must use --scrape-examples-output-path and --scrape-examples-target-crate together
|
||||||
|
|
|
||||||
|
|
@ -1 +1,3 @@
|
||||||
//@ compile-flags: -Z unstable-options --scrape-examples-output-path ex.calls
|
//@ compile-flags: -Z unstable-options --scrape-examples-output-path ex.calls
|
||||||
|
|
||||||
|
//~? ERROR must use --scrape-examples-output-path and --scrape-examples-target-crate together
|
||||||
|
|
|
||||||
|
|
@ -1 +1,3 @@
|
||||||
//@ compile-flags: --output ./foo
|
//@ compile-flags: --output ./foo
|
||||||
|
|
||||||
|
//~? ERROR cannot use both 'out-dir' and 'output' at once
|
||||||
|
|
|
||||||
|
|
@ -58,3 +58,8 @@ pub fn main() {
|
||||||
global_asm!(".intel_syntax noprefix", "nop");
|
global_asm!(".intel_syntax noprefix", "nop");
|
||||||
//[x86_64]~^ WARN avoid using `.intel_syntax`
|
//[x86_64]~^ WARN avoid using `.intel_syntax`
|
||||||
// Global assembly errors don't have line numbers, so no error on ARM.
|
// Global assembly errors don't have line numbers, so no error on ARM.
|
||||||
|
|
||||||
|
//[arm_llvm_18]~? ERROR unknown directive
|
||||||
|
//[arm_llvm_18]~? ERROR unknown directive
|
||||||
|
//[arm]~? ERROR unknown directive
|
||||||
|
//[arm]~? ERROR unknown directive
|
||||||
|
|
|
||||||
|
|
@ -37,3 +37,5 @@
|
||||||
//@ [emscripten_wasm_eh_]compile-flags: --cfg emscripten_wasm_eh
|
//@ [emscripten_wasm_eh_]compile-flags: --cfg emscripten_wasm_eh
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR unexpected `--cfg
|
||||||
|
|
|
||||||
|
|
@ -36,3 +36,5 @@
|
||||||
//@ [unsafe_attr]compile-flags: --check-cfg=unsafe(cfg(foo))
|
//@ [unsafe_attr]compile-flags: --check-cfg=unsafe(cfg(foo))
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR invalid `--check-cfg` argument
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,5 @@
|
||||||
// the path of the dylib.
|
// the path of the dylib.
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR couldn't load codegen backend /non-existing-one.so
|
||||||
|
|
|
||||||
|
|
@ -34,3 +34,5 @@ fn main() {
|
||||||
let z = foo(double, 2);
|
let z = foo(double, 2);
|
||||||
assert_eq!(z, 4);
|
assert_eq!(z, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,5 @@ const fn bar(x: usize) -> usize {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -24,3 +24,5 @@ fn main() {
|
||||||
assert_eq!(Y, 4);
|
assert_eq!(Y, 4);
|
||||||
assert_eq!(Z, 4);
|
assert_eq!(Z, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,6 @@ fn main() {
|
||||||
post_monomorphization_error::stdarch_intrinsic::<2>();
|
post_monomorphization_error::stdarch_intrinsic::<2>();
|
||||||
//~^ NOTE the above error was encountered while instantiating
|
//~^ NOTE the above error was encountered while instantiating
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR evaluation of `post_monomorphization_error::ValidateConstImm::<2, 0, 1>::VALID` failed
|
||||||
|
//~? NOTE erroneous constant encountered
|
||||||
|
|
|
||||||
|
|
@ -13,3 +13,5 @@ static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn
|
||||||
//~| NOTE calling a function with calling convention C using calling convention Rust
|
//~| NOTE calling a function with calling convention C using calling convention Rust
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -28,3 +28,5 @@ fn main() {
|
||||||
// this test only causes errors due to the line below, so post-monomorphization
|
// this test only causes errors due to the line below, so post-monomorphization
|
||||||
let y = <String as Bar<Vec<u32>, String>>::F;
|
let y = <String as Bar<Vec<u32>, String>>::F;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,5 @@ static TEST_BAD: &mut i32 = {
|
||||||
//~^ ERROR could not evaluate static initializer
|
//~^ ERROR could not evaluate static initializer
|
||||||
//~| NOTE calling non-const function `Box::<i32>::new`
|
//~| NOTE calling non-const function `Box::<i32>::new`
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -31,3 +31,5 @@ const REF_IMMUT: &u8 = &MY_STATIC;
|
||||||
const READ_IMMUT: u8 = *REF_IMMUT;
|
const READ_IMMUT: u8 = *REF_IMMUT;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -11,3 +11,5 @@ static TEST_BAD: () = {
|
||||||
//~^ ERROR could not evaluate static initializer
|
//~^ ERROR could not evaluate static initializer
|
||||||
//~| NOTE inline assembly is not supported
|
//~| NOTE inline assembly is not supported
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -114,3 +114,5 @@ fn main() {
|
||||||
}
|
}
|
||||||
*OH_YES = 99; //~ ERROR cannot assign to `*OH_YES`, as `OH_YES` is an immutable static item
|
*OH_YES = 99; //~ ERROR cannot assign to `*OH_YES`, as `OH_YES` is an immutable static item
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,5 @@ static C: () = foo();
|
||||||
//~| NOTE calling non-const function `foo`
|
//~| NOTE calling non-const function `foo`
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -21,3 +21,5 @@ static PTR_INT_TRANSMUTE: () = unsafe {
|
||||||
// their `PartialEq` impl is non-`const`.
|
// their `PartialEq` impl is non-`const`.
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -38,3 +38,5 @@ static RAW_MUT_COERCE: SyncPtr<i32> = SyncPtr { x: &mut 0 };
|
||||||
//~^ ERROR mutable pointer in final value
|
//~^ ERROR mutable pointer in final value
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -23,3 +23,5 @@ static TEST_BAD_REF: () = {
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -4,3 +4,5 @@
|
||||||
//@ compile-flags: -Z dump-dep-graph
|
//@ compile-flags: -Z dump-dep-graph
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR can't dump dependency graph without `-Z query-dep-graph`
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ compile-flags: -Car=foo
|
//@ compile-flags: -Car=foo
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN `-C ar`: this option is deprecated and does nothing
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,9 @@
|
||||||
//@[no_val] compile-flags: -Cinline-threshold
|
//@[no_val] compile-flags: -Cinline-threshold
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[good_val]~? WARN `-C inline-threshold`: this option is deprecated and does nothing
|
||||||
|
//[bad_val]~? WARN `-C inline-threshold`: this option is deprecated and does nothing
|
||||||
|
//[bad_val]~? ERROR incorrect value `asd` for codegen option `inline-threshold`
|
||||||
|
//[no_val]~? WARN `-C inline-threshold`: this option is deprecated and does nothing
|
||||||
|
//[no_val]~? ERROR codegen option `inline-threshold` requires a number
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ compile-flags: -Cno-stack-check
|
//@ compile-flags: -Cno-stack-check
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? WARN `-C no-stack-check`: this option is deprecated and does nothing
|
||||||
|
|
|
||||||
|
|
@ -51,3 +51,6 @@ fn main() {
|
||||||
let x: &Bottom = &t; //~ ERROR mismatched types
|
let x: &Bottom = &t; //~ ERROR mismatched types
|
||||||
//~^ error recursion limit
|
//~^ error recursion limit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR reached the recursion limit finding the struct tail for `K`
|
||||||
|
//~? ERROR reached the recursion limit finding the struct tail for `Bottom`
|
||||||
|
|
|
||||||
|
|
@ -28,3 +28,5 @@ pub fn check_async() {
|
||||||
|
|
||||||
let _recovery_witness: () = 0; //~ ERROR mismatched types
|
let _recovery_witness: () = 0; //~ ERROR mismatched types
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR macro expansion ends with an incomplete expression
|
||||||
|
|
|
||||||
|
|
@ -39,3 +39,5 @@ pub fn check_async() {
|
||||||
|
|
||||||
let _recovery_witness: () = 0; //~ ERROR mismatched types
|
let _recovery_witness: () = 0; //~ ERROR mismatched types
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR macro expansion ends with an incomplete expression
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
|
|
||||||
extern crate bad_main_functions;
|
extern crate bad_main_functions;
|
||||||
pub use bad_main_functions::boilerplate as main;
|
pub use bad_main_functions::boilerplate as main;
|
||||||
|
|
||||||
|
//~? ERROR `main` function has wrong type
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@
|
||||||
//@ compile-flags: --target x86_64_unknown-linux-musl
|
//@ compile-flags: --target x86_64_unknown-linux-musl
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR Error loading target specification: Could not find specification for target "x86_64_unknown-linux-musl"
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,5 @@
|
||||||
extern "C" {}
|
extern "C" {}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[in_flag]~? ERROR unknown linking modifier `link-arg`
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,5 @@
|
||||||
extern "C" {}
|
extern "C" {}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[in_flag]~? ERROR linking modifier `as-needed` is unstable
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ failure-status: 1
|
//@ failure-status: 1
|
||||||
fn main() {
|
fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR incorrect value `invalid-value` for unstable option `fmt-debug`
|
||||||
|
|
|
||||||
|
|
@ -15,3 +15,5 @@ struct Foo { //~ ERROR has infinite size
|
||||||
struct Bar<T>([T; 1]);
|
struct Bar<T>([T; 1]);
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR reached the recursion limit finding the struct tail for `Take`
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,6 @@
|
||||||
//@ [bad] compile-flags: -Cinstrument-coverage=bad-value
|
//@ [bad] compile-flags: -Cinstrument-coverage=bad-value
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[blank]~? ERROR incorrect value `` for codegen option `instrument-coverage`
|
||||||
|
//[bad]~? ERROR incorrect value `bad-value` for codegen option `instrument-coverage`
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,5 @@
|
||||||
//@ [bad] compile-flags: -Zcoverage-options=bad
|
//@ [bad] compile-flags: -Zcoverage-options=bad
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[bad]~? ERROR incorrect value `bad` for unstable option `coverage-options`
|
||||||
|
|
|
||||||
|
|
@ -15,3 +15,7 @@
|
||||||
|
|
||||||
#[lang = "sized"]
|
#[lang = "sized"]
|
||||||
trait Sized {}
|
trait Sized {}
|
||||||
|
|
||||||
|
//[BADFLAGS]~? ERROR incorrect value `leaf` for unstable option `branch-protection`
|
||||||
|
//[BADFLAGSPC]~? ERROR incorrect value `pc` for unstable option `branch-protection`
|
||||||
|
//[BADTARGET]~? ERROR `-Zbranch-protection` is only supported on aarch64
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ compile-flags: -Cpasses=unknown-pass
|
//@ compile-flags: -Cpasses=unknown-pass
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR failed to run LLVM passes: unknown pass name 'unknown-pass'
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,5 @@
|
||||||
// issue: 113981
|
// issue: 113981
|
||||||
|
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR invalid character '$' in crate name: `need_crate_arg_ignore_tidy$x`
|
||||||
|
|
|
||||||
|
|
@ -1 +1,3 @@
|
||||||
//@ compile-flags: --print yyyy
|
//@ compile-flags: --print yyyy
|
||||||
|
|
||||||
|
//~? ERROR unknown print request: `yyyy`
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,5 @@ mod auxiliary {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR file not found for module `baz`
|
||||||
|
|
|
||||||
|
|
@ -59,3 +59,5 @@ fn ice() {
|
||||||
|
|
||||||
// use `start`
|
// use `start`
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR requires `copy` lang_item
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,8 @@
|
||||||
// Tests various illegal values for the "modifier" part of an `-l` flag.
|
// Tests various illegal values for the "modifier" part of an `-l` flag.
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[blank]~? ERROR invalid linking modifier syntax, expected '+' or '-' prefix
|
||||||
|
//[no-prefix]~? ERROR invalid linking modifier syntax, expected '+' or '-' prefix
|
||||||
|
//[prefix-only]~? ERROR unknown linking modifier ``
|
||||||
|
//[unknown]~? ERROR unknown linking modifier `ferris`
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
//@ compile-flags:-lstatic:+whole-archive,-whole-archive=foo
|
//@ compile-flags:-lstatic:+whole-archive,-whole-archive=foo
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR multiple `whole-archive` modifiers in a single `-l` option
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,5 @@
|
||||||
//@ only-msvc
|
//@ only-msvc
|
||||||
//@ normalize-stderr: "(?:.|\n)*(⦺ⅈ⽯⭏⽽◃⡽⚞)(?:.|\n)*" -> "$1"
|
//@ normalize-stderr: "(?:.|\n)*(⦺ⅈ⽯⭏⽽◃⡽⚞)(?:.|\n)*" -> "$1"
|
||||||
pub fn main() {}
|
pub fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR linking with `
|
||||||
|
|
|
||||||
|
|
@ -8,3 +8,6 @@
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[one]~? ERROR some `-C link-self-contained` components were both enabled and disabled: linker
|
||||||
|
//[many]~? ERROR some `-C link-self-contained` components were both enabled and disabled: crto, linker
|
||||||
|
|
|
||||||
|
|
@ -22,3 +22,5 @@ fn main() {
|
||||||
println!("{:p}", &dep1::collision);
|
println!("{:p}", &dep1::collision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR symbol `collision` is already defined
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,5 @@ extern "C" {
|
||||||
pub fn lib_main() {
|
pub fn lib_main() {
|
||||||
unsafe { f(42); }
|
unsafe { f(42); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR Dlltool could not create import library with
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,5 @@ extern "C" {
|
||||||
pub fn lib_main() {
|
pub fn lib_main() {
|
||||||
unsafe { f(42); }
|
unsafe { f(42); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR Error calling dlltool 'does_not_exist.exe': program not found
|
||||||
|
|
|
||||||
|
|
@ -31,3 +31,5 @@ fn main() {
|
||||||
// WARN see in the stderr file, the warning points to the included file.
|
// WARN see in the stderr file, the warning points to the included file.
|
||||||
include!("expansion-time-include.rs");
|
include!("expansion-time-include.rs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN include macro expected single expression in source
|
||||||
|
|
|
||||||
|
|
@ -27,3 +27,10 @@ fn main() {
|
||||||
foo();
|
foo();
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN lint `private_no_mangle_fns` has been removed
|
||||||
|
//~? WARN lint `private_no_mangle_statics` has been removed
|
||||||
|
//~? WARN lint `private_no_mangle_fns` has been removed
|
||||||
|
//~? WARN lint `private_no_mangle_statics` has been removed
|
||||||
|
//~? WARN lint `private_no_mangle_fns` has been removed
|
||||||
|
//~? WARN lint `private_no_mangle_statics` has been removed
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
//@ compile-flags: -C lto -C embed-bitcode=no
|
//@ compile-flags: -C lto -C embed-bitcode=no
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR options `-C embed-bitcode=no` and `-C lto` are incompatible
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
//@ error-pattern include macro expected single expression
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
include!("include-single-expr-helper.rs");
|
include!("include-single-expr-helper.rs");
|
||||||
include!("include-single-expr-helper-1.rs");
|
include!("include-single-expr-helper-1.rs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR include macro expected single expression
|
||||||
|
|
|
||||||
|
|
@ -51,3 +51,5 @@ fn main() {
|
||||||
foo(true, &mut S(13), S(14), S(15));
|
foo(true, &mut S(13), S(14), S(15));
|
||||||
foo(false, &mut S(13), S(14), S(15));
|
foo(false, &mut S(13), S(14), S(15));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR stop_after_dataflow ended compilation
|
||||||
|
|
|
||||||
|
|
@ -20,3 +20,5 @@ fn foo() -> Option<i32> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR stop_after_dataflow ended compilation
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,5 @@ fn foo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR stop_after_dataflow ended compilation
|
||||||
|
|
|
||||||
|
|
@ -26,3 +26,5 @@ fn foo() -> i32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR stop_after_dataflow ended compilation
|
||||||
|
|
|
||||||
|
|
@ -49,3 +49,5 @@ fn main() {
|
||||||
foo(true, &mut S(13), S(14), S(15));
|
foo(true, &mut S(13), S(14), S(15));
|
||||||
foo(false, &mut S(13), S(14), S(15));
|
foo(false, &mut S(13), S(14), S(15));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR stop_after_dataflow ended compilation
|
||||||
|
|
|
||||||
|
|
@ -22,3 +22,5 @@ fn main() {
|
||||||
foo(&mut S(13));
|
foo(&mut S(13));
|
||||||
foo(&mut S(13));
|
foo(&mut S(13));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR stop_after_dataflow ended compilation
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,6 @@
|
||||||
//@[mixed] error-pattern: warning: MIR pass `ThisPassDoesNotExist` is unknown and will be ignored
|
//@[mixed] error-pattern: warning: MIR pass `ThisPassDoesNotExist` is unknown and will be ignored
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//[empty]~? ERROR incorrect value `` for unstable option `mir-enable-passes`
|
||||||
|
//[unprefixed]~? ERROR incorrect value `CheckAlignment` for unstable option `mir-enable-passes`
|
||||||
|
|
|
||||||
|
|
@ -16,3 +16,5 @@ fn oom(_: core::alloc::Layout) -> ! {
|
||||||
}
|
}
|
||||||
|
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
|
//~? ERROR no global memory allocator found but one is required
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,4 @@
|
||||||
mod foo;
|
mod foo;
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR file not found for module `missing`
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,4 @@
|
||||||
mod foo_inline;
|
mod foo_inline;
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR file not found for module `missing`
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@
|
||||||
#[panic_handler] //~ ERROR `panic_impl` lang item must be applied to a function
|
#[panic_handler] //~ ERROR `panic_impl` lang item must be applied to a function
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
static X: u32 = 42;
|
static X: u32 = 42;
|
||||||
|
|
||||||
|
//~? ERROR `#[panic_handler]` function required, but not found
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,6 @@
|
||||||
include!("auxiliary/issue-94340-inc.rs");
|
include!("auxiliary/issue-94340-inc.rs");
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR an inner attribute is not permitted in this context
|
||||||
|
//~? ERROR an inner attribute is not permitted in this context
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,5 @@ mod unclosed_delim_mod;
|
||||||
fn main() {
|
fn main() {
|
||||||
let _: usize = unclosed_delim_mod::new();
|
let _: usize = unclosed_delim_mod::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR mismatched closing delimiter: `}`
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,5 @@
|
||||||
//@ compile-flags: -Z patchable-function-entry=1,2
|
//@ compile-flags: -Z patchable-function-entry=1,2
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR incorrect value `1,2` for unstable option `patchable-function-entry`
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ needs-llvm-components: x86
|
//@ needs-llvm-components: x86
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR only Apple targets currently support deployment version info
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
//@ compile-flags: -Z span-debug
|
//@ compile-flags: -Z span-debug
|
||||||
//@ error-pattern:custom inner attributes are unstable
|
|
||||||
//@ error-pattern:inner macro attributes are unstable
|
|
||||||
//@ proc-macro: test-macros.rs
|
//@ proc-macro: test-macros.rs
|
||||||
|
|
||||||
#![no_std] // Don't load unnecessary hygiene information from std
|
#![no_std] // Don't load unnecessary hygiene information from std
|
||||||
|
|
@ -15,3 +13,6 @@ mod module_with_attrs;
|
||||||
//~| ERROR custom inner attributes are unstable
|
//~| ERROR custom inner attributes are unstable
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR custom inner attributes are unstable
|
||||||
|
//~? ERROR inner macro attributes are unstable
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ LL | #![print_attr]
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0658]: non-inline modules in proc macro input are unstable
|
error[E0658]: non-inline modules in proc macro input are unstable
|
||||||
--> $DIR/inner-attr-non-inline-mod.rs:13:1
|
--> $DIR/inner-attr-non-inline-mod.rs:11:1
|
||||||
|
|
|
|
||||||
LL | mod module_with_attrs;
|
LL | mod module_with_attrs;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
@ -29,7 +29,7 @@ LL | mod module_with_attrs;
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0658]: custom inner attributes are unstable
|
error[E0658]: custom inner attributes are unstable
|
||||||
--> $DIR/inner-attr-non-inline-mod.rs:13:1
|
--> $DIR/inner-attr-non-inline-mod.rs:11:1
|
||||||
|
|
|
|
||||||
LL | mod module_with_attrs;
|
LL | mod module_with_attrs;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
|
@ -4,35 +4,35 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||||
Punct {
|
Punct {
|
||||||
ch: '#',
|
ch: '#',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Group {
|
Group {
|
||||||
delimiter: Bracket,
|
delimiter: Bracket,
|
||||||
stream: TokenStream [
|
stream: TokenStream [
|
||||||
Ident {
|
Ident {
|
||||||
ident: "deny",
|
ident: "deny",
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Group {
|
Group {
|
||||||
delimiter: Parenthesis,
|
delimiter: Parenthesis,
|
||||||
stream: TokenStream [
|
stream: TokenStream [
|
||||||
Ident {
|
Ident {
|
||||||
ident: "unused_attributes",
|
ident: "unused_attributes",
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "mod",
|
ident: "mod",
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "module_with_attrs",
|
ident: "module_with_attrs",
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Group {
|
Group {
|
||||||
delimiter: Brace,
|
delimiter: Brace,
|
||||||
|
|
@ -40,38 +40,38 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [
|
||||||
Punct {
|
Punct {
|
||||||
ch: '#',
|
ch: '#',
|
||||||
spacing: Joint,
|
spacing: Joint,
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: '!',
|
ch: '!',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Group {
|
Group {
|
||||||
delimiter: Bracket,
|
delimiter: Bracket,
|
||||||
stream: TokenStream [
|
stream: TokenStream [
|
||||||
Ident {
|
Ident {
|
||||||
ident: "rustfmt",
|
ident: "rustfmt",
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ':',
|
ch: ':',
|
||||||
spacing: Joint,
|
spacing: Joint,
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Punct {
|
Punct {
|
||||||
ch: ':',
|
ch: ':',
|
||||||
spacing: Alone,
|
spacing: Alone,
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
Ident {
|
Ident {
|
||||||
ident: "skip",
|
ident: "skip",
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
span: $DIR/inner-attr-non-inline-mod.rs:13:1: 13:23 (#0),
|
span: $DIR/inner-attr-non-inline-mod.rs:11:1: 11:23 (#0),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -18,3 +18,5 @@ mod second {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR using an old version of `rental`
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,5 @@ fn main() {
|
||||||
let _ = "" + 1; //~ ERROR E0369
|
let _ = "" + 1; //~ ERROR E0369
|
||||||
parse_error::Canonical.foo(); // ok, `parse_error.rs` had parse errors
|
parse_error::Canonical.foo(); // ok, `parse_error.rs` had parse errors
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR expected one of `+`, `,`, `::`, `=`, or `>`, found `From`
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,5 @@ fn main() {
|
||||||
(CONSTANT.file(), CONSTANT.line(), CONSTANT.column()),
|
(CONSTANT.file(), CONSTANT.line(), CONSTANT.column()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? WARN skipping const checks
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,5 @@ extern crate rmeta_meta;
|
||||||
fn main() {
|
fn main() {
|
||||||
rmeta_meta::missing_optimized_mir();
|
rmeta_meta::missing_optimized_mir();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~? ERROR missing optimized MIR for an item in the crate `rmeta_meta`
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ check-fail
|
//@ check-fail
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR incorrect value `default` for unstable option `on-broken-pipe`
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ check-fail
|
//@ check-fail
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR unstable option `on-broken-pipe` requires either `kill`, `error`, or `inherit`
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
//@ check-fail
|
//@ check-fail
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR incorrect value `wrong` for unstable option `on-broken-pipe`
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,5 @@
|
||||||
//@ rustc-env:RUST_MIN_STACK=banana
|
//@ rustc-env:RUST_MIN_STACK=banana
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
|
//~? ERROR `RUST_MIN_STACK` should be a number of bytes, but was "banana"
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR `-Zsanitizer-cfi-canonical-jump-tables` requires `-Zsanitizer=cfi`
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR `-Zsanitizer-cfi-generalize-pointers` requires `-Zsanitizer=cfi` or `-Zsanitizer=kcfi`
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,6 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR cfi sanitizer is not supported for this target
|
||||||
|
//~? ERROR `-Zsanitizer=cfi` is incompatible with `-Zsanitizer=kcfi`
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR `-Zsanitizer-cfi-normalize-integers` requires `-Zsanitizer=cfi` or `-Zsanitizer=kcfi`
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR `-Zsanitizer=cfi` requires `-Clto` or `-Clinker-plugin-lto`
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR `-Zsanitizer=cfi` with `-Clto` requires `-Ccodegen-units=1`
|
||||||
|
|
|
||||||
|
|
@ -4,3 +4,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR sanitizer is incompatible with statically linked libc
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@
|
||||||
#![feature(no_core)]
|
#![feature(no_core)]
|
||||||
#![no_core]
|
#![no_core]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
|
//~? ERROR `-Zsplit-lto-unit` requires `-Clto`, `-Clto=thin`, or `-Clinker-plugin-lto`
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue