Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bogus error when creating for an impl for a nonexistent type #8767

Closed
jdm opened this issue Aug 26, 2013 · 14 comments · Fixed by #17321
Closed

Bogus error when creating for an impl for a nonexistent type #8767

jdm opened this issue Aug 26, 2013 · 14 comments · Fixed by #17321
Labels
A-diagnostics Area: Messages for errors, warnings, and lints E-easy Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.

Comments

@jdm
Copy link
Contributor

jdm commented Aug 26, 2013

impl B {
}

fn main() {
}
/tmp/foopy.rs:1:5: 1:6 error: found value name used as a type: def_mod({crate: 0, node: 3})
/tmp/foopy.rs:1 impl B {
                     ^
@owaspjocur
Copy link

Could this be fixed by "::unwrap" in the file (src/test/compile-fail/trait-or-new-type-instead.rs)

// error-pattern: found value name used as a type
impl Option::unwrap {
pub fn foo(&self) {

}

fn main() { }
screen shot 2013-11-05 at 11 22 35 am

@jdm
Copy link
Contributor Author

jdm commented Nov 5, 2013

@owaspjocur I don't understand your question, and that's not valid syntax. You can only create an impl for a type in the same module.

@owaspjocur
Copy link

definitely I'm confused :-P. Im trying to determine how to fix this issue.Has been a while I didnt work with C like language(last 5 years have been working with C# and Java) ;-)
If I create my own file (as you did writing the foopy.rs) and implement the same code, I get the issue. Rust is a compiler, so Im assuming that a compiler file should be fixed in order to avoid the user implement namespace overlapping imports. Is my assumption correct about this problem?

@jdm
Copy link
Contributor Author

jdm commented Nov 5, 2013

Yes, your assumption is correct. The goal is to provide an error message that makes sense when a program tries to create an impl for a type that is not in scope (ie. does not exist).

@owaspjocur
Copy link

The code I provided is a Rust compiler file (which i changed), not a new one. Im trying to understand where in the code can I implement this fix

@jdm
Copy link
Contributor Author

jdm commented Nov 6, 2013

Find the place that generates the error message, and follow the code backwards until it's clear where you could modify it to produce a better error message for this case.

@owaspjocur
Copy link

Someone gave me a good tip on how to debug Rust http://michaelwoerister.github.io/2013/09/27/what-you-call-the-present.html. I will try this. The terminal is quite archaic ;-P

@huonw
Copy link
Member

huonw commented Nov 6, 2013

@owaspjocur I think @jdm's point was essentially "grep for the error message, and look at the code there", using a full debugger to find out where it is is probably still quite hard at the moment.

In any case, running git grep "found name value used as type" turns up this code here. So it looks like one could just expand the _ pattern to cover more cases.

@owaspjocur
Copy link

@huonw I used Eclipse as explained by Michael and did a search and found that file. Now correct me if I'm wrong but the it seems that there is no
"match a_def {" (startting at line 444)
for the impl type.

I'm going to attempt to add a case and test

@owaspjocur
Copy link

@jdm in ast.rs there is an enumeration, I dont see one for 'impl' (such as DefTrait for example)
line 226.
Isn't suppose to be one?

@jdm
Copy link
Contributor Author

jdm commented Nov 13, 2013

No, because the name we are creating an impl for is not itself an impl; the compiler seems to think that it is a module instead. Figuring out why this is the case would be a good start.

@owaspjocur
Copy link

@jdm seems like astriranna solved the issue by adding:
ast::DefMod(_) =>

      tcx.sess.span_fatal(ast_ty.span,

                          format!("found module name used as a type: {:?}", a_def));
      }

@owaspjocur
Copy link

I just tested but this does not work for 'impl' (still get the same error message)

@jdm
Copy link
Contributor Author

jdm commented Nov 14, 2013

Yes, that is not a solution, just a slightly clearer (but still incorrect) error message.

bors added a commit that referenced this issue Nov 24, 2013
Issue #8763 is about improving a particular error message.

* added case & better error message for "impl trait for module"
* added compile-fail test trait-impl-for-module.rs
* updated copyright dates
* revised compile-fail test trait-or-new-type-instead
   (the error message for the modified test is still unclear, but that's a different bug #8767)
apoelstra added a commit to apoelstra/rust that referenced this issue Sep 28, 2014
bors added a commit that referenced this issue Sep 29, 2014
flip1995 pushed a commit to flip1995/rust that referenced this issue May 5, 2022
…effen

Add missing quite in `large_include_file` example

Roses are red,
violets are blue,
this fix,
was simple to do

Closes: rust-lang/rust-clippy#8765

changelog: None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints E-easy Call for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants