Don't let a type parameter named "Self" unchanged past HIR lowering.
This commit is contained in:
parent
b2627b080a
commit
795b6adc9a
@ -391,9 +391,18 @@ fn lower_ty_param_bound(&mut self, tpb: &TyParamBound) -> hir::TyParamBound {
|
||||
}
|
||||
|
||||
fn lower_ty_param(&mut self, tp: &TyParam) -> hir::TyParam {
|
||||
let mut name = tp.ident.name;
|
||||
|
||||
// Don't expose `Self` (recovered "keyword used as ident" parse error).
|
||||
// `rustc::ty` expects `Self` to be only used for a trait's `Self`.
|
||||
// Instead, use gensym("Self") to create a distinct name that looks the same.
|
||||
if name == token::keywords::SelfType.name() {
|
||||
name = token::gensym("Self");
|
||||
}
|
||||
|
||||
hir::TyParam {
|
||||
id: tp.id,
|
||||
name: tp.ident.name,
|
||||
name: name,
|
||||
bounds: self.lower_bounds(&tp.bounds),
|
||||
default: tp.default.as_ref().map(|x| self.lower_ty(x)),
|
||||
span: tp.span,
|
||||
|
19
src/test/compile-fail/issue-36638.rs
Normal file
19
src/test/compile-fail/issue-36638.rs
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// compile-flags: -Z continue-parse-after-error
|
||||
|
||||
struct Foo<Self>(Self);
|
||||
//~^ ERROR expected identifier, found keyword `Self`
|
||||
|
||||
trait Bar<Self> {}
|
||||
//~^ ERROR expected identifier, found keyword `Self`
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user