Skip to content

Commit

Permalink
E0379: Make diagnostic more precise
Browse files Browse the repository at this point in the history
  • Loading branch information
fmease committed Jan 2, 2024
1 parent 8f546aa commit ae8e401
Show file tree
Hide file tree
Showing 13 changed files with 31 additions and 20 deletions.
10 changes: 8 additions & 2 deletions compiler/rustc_ast_passes/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,14 @@ ast_passes_tilde_const_disallowed = `~const` is not allowed here
.item = this item cannot have `~const` trait bounds
ast_passes_trait_fn_const =
functions in traits cannot be declared const
.label = functions in traits cannot be const
functions in {$in_impl ->
[true] trait impls
*[false] traits
} cannot be declared const
.label = functions in {$in_impl ->
[true] trait impls
*[false] traits
} cannot be const
ast_passes_trait_object_single_bound = only a single explicit lifetime bound is permitted
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_ast_passes/src/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ impl<'a> AstValidator<'a> {

fn check_trait_fn_not_const(&self, constness: Const) {
if let Const::Yes(span) = constness {
self.dcx().emit_err(errors::TraitFnConst { span });
self.dcx().emit_err(errors::TraitFnConst { span, in_impl: self.in_trait_impl });
}
}

Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_ast_passes/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ pub struct TraitFnConst {
#[primary_span]
#[label]
pub span: Span,
pub in_impl: bool,
}

#[derive(Diagnostic)]
Expand Down
4 changes: 4 additions & 0 deletions compiler/rustc_error_codes/src/error_codes/E0379.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ Erroneous code example:
trait Foo {
const fn bar() -> u32; // error!
}
impl Foo for () {
const fn bar() -> u32 { 0 } // error!
}
```

Trait methods cannot be declared `const` by design. For more information, see
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/consts/const-fn-mismatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ trait Foo {

impl Foo for u32 {
const fn f() -> u32 {
//~^ ERROR functions in traits cannot be declared const
//~^ ERROR functions in trait impls cannot be declared const
22
}
}
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/consts/const-fn-mismatch.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error[E0379]: functions in traits cannot be declared const
error[E0379]: functions in trait impls cannot be declared const
--> $DIR/const-fn-mismatch.rs:11:5
|
LL | const fn f() -> u32 {
| ^^^^^ functions in traits cannot be const
| ^^^^^ functions in trait impls cannot be const

error: aborting due to 1 previous error

Expand Down
2 changes: 1 addition & 1 deletion tests/ui/feature-gates/feature-gate-min_const_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ trait Foo {
}

impl Foo for u32 {
const fn foo() -> u32 { 0 } //~ ERROR functions in traits cannot be declared const
const fn foo() -> u32 { 0 } //~ ERROR functions in trait impls cannot be declared const
}

trait Bar {}
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/feature-gates/feature-gate-min_const_fn.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ error[E0379]: functions in traits cannot be declared const
LL | const fn bar() -> u32 { 0 }
| ^^^^^ functions in traits cannot be const

error[E0379]: functions in traits cannot be declared const
error[E0379]: functions in trait impls cannot be declared const
--> $DIR/feature-gate-min_const_fn.rs:11:5
|
LL | const fn foo() -> u32 { 0 }
| ^^^^^ functions in traits cannot be const
| ^^^^^ functions in trait impls cannot be const

error: aborting due to 3 previous errors

Expand Down
4 changes: 2 additions & 2 deletions tests/ui/mismatched_types/const-fn-in-trait.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ error[E0379]: functions in traits cannot be declared const
LL | const fn g();
| ^^^^^ functions in traits cannot be const

error[E0379]: functions in traits cannot be declared const
error[E0379]: functions in trait impls cannot be declared const
--> $DIR/const-fn-in-trait.rs:7:5
|
LL | const fn f() -> u32 { 22 }
| ^^^^^ functions in traits cannot be const
| ^^^^^ functions in trait impls cannot be const

error: aborting due to 2 previous errors

Expand Down
4 changes: 2 additions & 2 deletions tests/ui/parser/fn-header-semantic-fail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ fn main() {
impl X for Y {
async fn ft1() {} // OK.
unsafe fn ft2() {} // OK.
const fn ft3() {} //~ ERROR functions in traits cannot be declared const
const fn ft3() {} //~ ERROR functions in trait impls cannot be declared const
extern "C" fn ft4() {}
const async unsafe extern "C" fn ft5() {}
//~^ ERROR functions in traits cannot be declared const
//~^ ERROR functions in trait impls cannot be declared const
//~| ERROR functions cannot be both `const` and `async`
}

Expand Down
8 changes: 4 additions & 4 deletions tests/ui/parser/fn-header-semantic-fail.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ LL | const async unsafe extern "C" fn ft5();
| | `async` because of this
| `const` because of this

error[E0379]: functions in traits cannot be declared const
error[E0379]: functions in trait impls cannot be declared const
--> $DIR/fn-header-semantic-fail.rs:29:9
|
LL | const fn ft3() {}
| ^^^^^ functions in traits cannot be const
| ^^^^^ functions in trait impls cannot be const

error[E0379]: functions in traits cannot be declared const
error[E0379]: functions in trait impls cannot be declared const
--> $DIR/fn-header-semantic-fail.rs:31:9
|
LL | const async unsafe extern "C" fn ft5() {}
| ^^^^^ functions in traits cannot be const
| ^^^^^ functions in trait impls cannot be const

error: functions cannot be both `const` and `async`
--> $DIR/fn-header-semantic-fail.rs:31:9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ trait Trait {
}

impl const Trait for () {
const fn fun() {} //~ ERROR functions in traits cannot be declared const
const fn fun() {} //~ ERROR functions in trait impls cannot be declared const
}

fn main() {}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ error[E0379]: functions in traits cannot be declared const
LL | const fn fun();
| ^^^^^ functions in traits cannot be const

error[E0379]: functions in traits cannot be declared const
error[E0379]: functions in trait impls cannot be declared const
--> $DIR/trait-fn-const.rs:10:5
|
LL | const fn fun() {}
| ^^^^^ functions in traits cannot be const
| ^^^^^ functions in trait impls cannot be const

error: aborting due to 2 previous errors

Expand Down

0 comments on commit ae8e401

Please sign in to comment.