Reject explicit lifetimes in a reference type
diff --git a/syntax/check.rs b/syntax/check.rs
index 3b6937a..fa51ed3 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -1,5 +1,7 @@
use crate::syntax::atom::Atom::{self, *};
-use crate::syntax::{error, ident, Api, ExternFn, Lang, Ref, Slice, Struct, Ty1, Type, Types};
+use crate::syntax::{
+ error, ident, Api, ExternFn, Lang, Receiver, Ref, Slice, Struct, Ty1, Type, Types,
+};
use proc_macro2::{Delimiter, Group, Ident, TokenStream};
use quote::{quote, ToTokens};
use std::fmt::Display;
@@ -100,6 +102,10 @@
}
fn check_type_ref(cx: &mut Check, ty: &Ref) {
+ if ty.lifetime.is_some() {
+ cx.error(ty, "references with explicit lifetimes are not supported");
+ }
+
match ty.inner {
Type::Fn(_) | Type::Void(_) => {}
_ => return,
@@ -134,6 +140,13 @@
}
fn check_api_fn(cx: &mut Check, efn: &ExternFn) {
+ if let Some(receiver) = &efn.receiver {
+ if receiver.lifetime.is_some() {
+ let span = span_for_receiver_error(receiver);
+ cx.error(span, "references with explicit lifetimes are not supported");
+ }
+ }
+
for arg in &efn.args {
if is_unsized(cx, &arg.ty) {
let desc = describe(cx, &arg.ty);
@@ -223,6 +236,19 @@
quote!(#struct_token #brace_token)
}
+fn span_for_receiver_error(receiver: &Receiver) -> TokenStream {
+ let ampersand = receiver.ampersand;
+ let lifetime = &receiver.lifetime;
+ let mutability = receiver.mutability;
+ if receiver.shorthand {
+ let var = receiver.var;
+ quote!(#ampersand #lifetime #mutability #var)
+ } else {
+ let ty = &receiver.ty;
+ quote!(#ampersand #lifetime #mutability #ty)
+ }
+}
+
fn combine_errors(errors: Vec<Error>) -> Result<()> {
let mut iter = errors.into_iter();
let mut all_errors = match iter.next() {