aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2022-12-02 16:41:02 -0800
committerDavid Tolnay <dtolnay@gmail.com>2022-12-02 17:01:31 -0800
commit5e404f04a731881531ba3cfbacbe9f1bd0533435 (patch)
tree43288ab0a19f9f756500a773e71c2c2702e24b6a
parenta894a694a2e25f1c5ca6f2f273f56dff72bca6e1 (diff)
downloadcxx-5e404f04a731881531ba3cfbacbe9f1bd0533435.tar.gz
Adopt east const in generated code to avoid ambiguities
-rw-r--r--gen/src/builtin.rs8
-rw-r--r--gen/src/write.rs146
2 files changed, 78 insertions, 76 deletions
diff --git a/gen/src/builtin.rs b/gen/src/builtin.rs
index eb892d37..277c64f8 100644
--- a/gen/src/builtin.rs
+++ b/gen/src/builtin.rs
@@ -264,8 +264,8 @@ pub(super) fn write(out: &mut OutFile) {
out,
" Fail(::rust::repr::PtrLen &throw$) noexcept : throw$(throw$) {{}}",
);
- writeln!(out, " void operator()(const char *) noexcept;");
- writeln!(out, " void operator()(const std::string &) noexcept;");
+ writeln!(out, " void operator()(char const *) noexcept;");
+ writeln!(out, " void operator()(std::string const &) noexcept;");
writeln!(out, "}};");
}
@@ -352,7 +352,7 @@ pub(super) fn write(out: &mut OutFile) {
writeln!(out, "public:");
writeln!(out, " static Error error(repr::PtrLen repr) noexcept {{");
writeln!(out, " Error error;");
- writeln!(out, " error.msg = static_cast<const char *>(repr.ptr);");
+ writeln!(out, " error.msg = static_cast<char const *>(repr.ptr);");
writeln!(out, " error.len = repr.len;");
writeln!(out, " return error;");
writeln!(out, " }}");
@@ -412,7 +412,7 @@ pub(super) fn write(out: &mut OutFile) {
writeln!(out, " missing>::value>::type");
writeln!(out, "trycatch(Try &&func, Fail &&fail) noexcept try {{");
writeln!(out, " func();");
- writeln!(out, "}} catch (const ::std::exception &e) {{");
+ writeln!(out, "}} catch (::std::exception const &e) {{");
writeln!(out, " fail(e.what());");
writeln!(out, "}}");
out.end_block(Block::Namespace("behavior"));
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 22a0d4b9..6f535ccb 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -177,7 +177,7 @@ fn write_std_specializations(out: &mut OutFile, apis: &[Api]) {
writeln!(out, "template <> struct hash<{}> {{", qualified);
writeln!(
out,
- " ::std::size_t operator()(const {} &self) const noexcept {{",
+ " ::std::size_t operator()({} const &self) const noexcept {{",
qualified,
);
let link_name = mangle::operator(&strct.name, "hash");
@@ -285,12 +285,12 @@ fn write_struct<'a>(out: &mut OutFile<'a>, strct: &'a Struct, methods: &[&Extern
if operator_eq {
writeln!(
out,
- " bool operator==(const {} &) const noexcept;",
+ " bool operator==({} const &) const noexcept;",
strct.name.cxx,
);
writeln!(
out,
- " bool operator!=(const {} &) const noexcept;",
+ " bool operator!=({} const &) const noexcept;",
strct.name.cxx,
);
}
@@ -298,22 +298,22 @@ fn write_struct<'a>(out: &mut OutFile<'a>, strct: &'a Struct, methods: &[&Extern
if operator_ord {
writeln!(
out,
- " bool operator<(const {} &) const noexcept;",
+ " bool operator<({} const &) const noexcept;",
strct.name.cxx,
);
writeln!(
out,
- " bool operator<=(const {} &) const noexcept;",
+ " bool operator<=({} const &) const noexcept;",
strct.name.cxx,
);
writeln!(
out,
- " bool operator>(const {} &) const noexcept;",
+ " bool operator>({} const &) const noexcept;",
strct.name.cxx,
);
writeln!(
out,
- " bool operator>=(const {} &) const noexcept;",
+ " bool operator>=({} const &) const noexcept;",
strct.name.cxx,
);
}
@@ -510,7 +510,7 @@ fn write_struct_operator_decls<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
let link_name = mangle::operator(&strct.name, "eq");
writeln!(
out,
- "bool {}(const {1} &, const {1} &) noexcept;",
+ "bool {}({1} const &, {1} const &) noexcept;",
link_name, strct.name.cxx,
);
@@ -518,7 +518,7 @@ fn write_struct_operator_decls<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
let link_name = mangle::operator(&strct.name, "ne");
writeln!(
out,
- "bool {}(const {1} &, const {1} &) noexcept;",
+ "bool {}({1} const &, {1} const &) noexcept;",
link_name, strct.name.cxx,
);
}
@@ -528,14 +528,14 @@ fn write_struct_operator_decls<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
let link_name = mangle::operator(&strct.name, "lt");
writeln!(
out,
- "bool {}(const {1} &, const {1} &) noexcept;",
+ "bool {}({1} const &, {1} const &) noexcept;",
link_name, strct.name.cxx,
);
let link_name = mangle::operator(&strct.name, "le");
writeln!(
out,
- "bool {}(const {1} &, const {1} &) noexcept;",
+ "bool {}({1} const &, {1} const &) noexcept;",
link_name, strct.name.cxx,
);
@@ -543,14 +543,14 @@ fn write_struct_operator_decls<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
let link_name = mangle::operator(&strct.name, "gt");
writeln!(
out,
- "bool {}(const {1} &, const {1} &) noexcept;",
+ "bool {}({1} const &, {1} const &) noexcept;",
link_name, strct.name.cxx,
);
let link_name = mangle::operator(&strct.name, "ge");
writeln!(
out,
- "bool {}(const {1} &, const {1} &) noexcept;",
+ "bool {}({1} const &, {1} const &) noexcept;",
link_name, strct.name.cxx,
);
}
@@ -561,7 +561,7 @@ fn write_struct_operator_decls<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
let link_name = mangle::operator(&strct.name, "hash");
writeln!(
out,
- "::std::size_t {}(const {} &) noexcept;",
+ "::std::size_t {}({} const &) noexcept;",
link_name, strct.name.cxx,
);
}
@@ -580,7 +580,7 @@ fn write_struct_operators<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
out.next_section();
writeln!(
out,
- "bool {0}::operator==(const {0} &rhs) const noexcept {{",
+ "bool {0}::operator==({0} const &rhs) const noexcept {{",
strct.name.cxx,
);
let link_name = mangle::operator(&strct.name, "eq");
@@ -590,7 +590,7 @@ fn write_struct_operators<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
out.next_section();
writeln!(
out,
- "bool {0}::operator!=(const {0} &rhs) const noexcept {{",
+ "bool {0}::operator!=({0} const &rhs) const noexcept {{",
strct.name.cxx,
);
if derive::contains(&strct.derives, Trait::Eq) {
@@ -606,7 +606,7 @@ fn write_struct_operators<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
out.next_section();
writeln!(
out,
- "bool {0}::operator<(const {0} &rhs) const noexcept {{",
+ "bool {0}::operator<({0} const &rhs) const noexcept {{",
strct.name.cxx,
);
let link_name = mangle::operator(&strct.name, "lt");
@@ -616,7 +616,7 @@ fn write_struct_operators<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
out.next_section();
writeln!(
out,
- "bool {0}::operator<=(const {0} &rhs) const noexcept {{",
+ "bool {0}::operator<=({0} const &rhs) const noexcept {{",
strct.name.cxx,
);
let link_name = mangle::operator(&strct.name, "le");
@@ -626,7 +626,7 @@ fn write_struct_operators<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
out.next_section();
writeln!(
out,
- "bool {0}::operator>(const {0} &rhs) const noexcept {{",
+ "bool {0}::operator>({0} const &rhs) const noexcept {{",
strct.name.cxx,
);
if derive::contains(&strct.derives, Trait::Ord) {
@@ -640,7 +640,7 @@ fn write_struct_operators<'a>(out: &mut OutFile<'a>, strct: &'a Struct) {
out.next_section();
writeln!(
out,
- "bool {0}::operator>=(const {0} &rhs) const noexcept {{",
+ "bool {0}::operator>=({0} const &rhs) const noexcept {{",
strct.name.cxx,
);
if derive::contains(&strct.derives, Trait::Ord) {
@@ -714,25 +714,29 @@ fn write_cxx_function_shim<'a>(out: &mut OutFile<'a>, efn: &'a ExternFn) {
let mangled = mangle::extern_fn(efn, out.types);
write!(out, "{}(", mangled);
if let Some(receiver) = &efn.receiver {
- if !receiver.mutable {
- write!(out, "const ");
- }
write!(
out,
- "{} &self",
+ "{}",
out.types.resolve(&receiver.ty).name.to_fully_qualified(),
);
+ if !receiver.mutable {
+ write!(out, " const");
+ }
+ write!(out, " &self");
}
for (i, arg) in efn.args.iter().enumerate() {
if i > 0 || efn.receiver.is_some() {
write!(out, ", ");
}
if arg.ty == RustString {
- write!(out, "const ");
+ write_type_space(out, &arg.ty);
+ write!(out, "const *{}", arg.name.cxx);
} else if let Type::RustVec(_) = arg.ty {
- write!(out, "const ");
+ write_type_space(out, &arg.ty);
+ write!(out, "const *{}", arg.name.cxx);
+ } else {
+ write_extern_arg(out, arg);
}
- write_extern_arg(out, arg);
}
let indirect_return = indirect_return(efn, out.types);
if indirect_return {
@@ -903,14 +907,15 @@ fn write_rust_function_decl_impl(
write!(out, "{}(", link_name);
let mut needs_comma = false;
if let Some(receiver) = &sig.receiver {
- if !receiver.mutable {
- write!(out, "const ");
- }
write!(
out,
- "{} &self",
+ "{}",
out.types.resolve(&receiver.ty).name.to_fully_qualified(),
);
+ if !receiver.mutable {
+ write!(out, " const");
+ }
+ write!(out, " &self");
needs_comma = true;
}
for arg in &sig.args {
@@ -926,8 +931,11 @@ fn write_rust_function_decl_impl(
}
match sig.ret.as_ref().unwrap() {
Type::Ref(ret) => {
- write_pointee_type(out, &ret.inner, ret.mutable);
- write!(out, " *");
+ write_type_space(out, &ret.inner);
+ if !ret.mutable {
+ write!(out, "const ");
+ }
+ write!(out, "*");
}
ret => write_type_space(out, ret),
}
@@ -1030,8 +1038,11 @@ fn write_rust_function_shim_impl(
write!(out, "::rust::MaybeUninit<");
match sig.ret.as_ref().unwrap() {
Type::Ref(ret) => {
- write_pointee_type(out, &ret.inner, ret.mutable);
- write!(out, " *");
+ write_type_space(out, &ret.inner);
+ if !ret.mutable {
+ write!(out, "const ");
+ }
+ write!(out, "*");
}
ret => write_type(out, ret),
}
@@ -1150,11 +1161,11 @@ fn write_indirect_return_type(out: &mut OutFile, ty: &Type) {
write!(out, "*");
}
Type::Ref(ty) => {
+ write_type_space(out, &ty.inner);
if !ty.mutable {
write!(out, "const ");
}
- write_type(out, &ty.inner);
- write!(out, " *");
+ write!(out, "*");
}
_ => write_type(out, ty),
}
@@ -1176,11 +1187,11 @@ fn write_extern_return_type_space(out: &mut OutFile, ty: &Option<Type>) {
write!(out, "*");
}
Some(Type::Ref(ty)) => {
+ write_type_space(out, &ty.inner);
if !ty.mutable {
write!(out, "const ");
}
- write_type(out, &ty.inner);
- write!(out, " *");
+ write!(out, "*");
}
Some(Type::Str(_)) | Some(Type::SliceRef(_)) => {
out.builtin.repr_fat = true;
@@ -1246,22 +1257,28 @@ fn write_type(out: &mut OutFile, ty: &Type) {
write!(out, ">");
}
Type::Ref(r) => {
- write_pointee_type(out, &r.inner, r.mutable);
- write!(out, " &");
+ write_type_space(out, &r.inner);
+ if !r.mutable {
+ write!(out, "const ");
+ }
+ write!(out, "&");
}
Type::Ptr(p) => {
- write_pointee_type(out, &p.inner, p.mutable);
- write!(out, " *");
+ write_type_space(out, &p.inner);
+ if !p.mutable {
+ write!(out, "const ");
+ }
+ write!(out, "*");
}
Type::Str(_) => {
write!(out, "::rust::Str");
}
Type::SliceRef(slice) => {
write!(out, "::rust::Slice<");
+ write_type_space(out, &slice.inner);
if slice.mutability.is_none() {
- write!(out, "const ");
+ write!(out, "const");
}
- write_type(out, &slice.inner);
write!(out, ">");
}
Type::Fn(f) => {
@@ -1288,21 +1305,6 @@ fn write_type(out: &mut OutFile, ty: &Type) {
}
}
-// Write just the T type behind a &T or &mut T or *const T or *mut T.
-fn write_pointee_type(out: &mut OutFile, inner: &Type, mutable: bool) {
- if let Type::Ptr(_) = inner {
- write_type_space(out, inner);
- if !mutable {
- write!(out, "const");
- }
- } else {
- if !mutable {
- write!(out, "const ");
- }
- write_type(out, inner);
- }
-}
-
fn write_atom(out: &mut OutFile, atom: Atom) {
match atom {
Bool => write!(out, "bool"),
@@ -1460,7 +1462,7 @@ fn write_rust_vec_extern(out: &mut OutFile, key: NamedImplKey) {
writeln!(
out,
- "void cxxbridge1$rust_vec${}$new(const ::rust::Vec<{}> *ptr) noexcept;",
+ "void cxxbridge1$rust_vec${}$new(::rust::Vec<{}> const *ptr) noexcept;",
instance, inner,
);
writeln!(
@@ -1470,17 +1472,17 @@ fn write_rust_vec_extern(out: &mut OutFile, key: NamedImplKey) {
);
writeln!(
out,
- "::std::size_t cxxbridge1$rust_vec${}$len(const ::rust::Vec<{}> *ptr) noexcept;",
+ "::std::size_t cxxbridge1$rust_vec${}$len(::rust::Vec<{}> const *ptr) noexcept;",
instance, inner,
);
writeln!(
out,
- "::std::size_t cxxbridge1$rust_vec${}$capacity(const ::rust::Vec<{}> *ptr) noexcept;",
+ "::std::size_t cxxbridge1$rust_vec${}$capacity(::rust::Vec<{}> const *ptr) noexcept;",
instance, inner,
);
writeln!(
out,
- "const {} *cxxbridge1$rust_vec${}$data(const ::rust::Vec<{0}> *ptr) noexcept;",
+ "{} const *cxxbridge1$rust_vec${}$data(::rust::Vec<{0}> const *ptr) noexcept;",
inner, instance,
);
writeln!(
@@ -1577,7 +1579,7 @@ fn write_rust_vec_impl(out: &mut OutFile, key: NamedImplKey) {
writeln!(out, "template <>");
begin_function_definition(out);
- writeln!(out, "const {} *Vec<{0}>::data() const noexcept {{", inner);
+ writeln!(out, "{} const *Vec<{0}>::data() const noexcept {{", inner);
writeln!(out, " return cxxbridge1$rust_vec${}$data(this);", instance);
writeln!(out, "}}");
@@ -1706,7 +1708,7 @@ fn write_unique_ptr_common(out: &mut OutFile, ty: UniquePtr) {
begin_function_definition(out);
writeln!(
out,
- "const {} *cxxbridge1$unique_ptr${}$get(const ::std::unique_ptr<{}> &ptr) noexcept {{",
+ "{} const *cxxbridge1$unique_ptr${}$get(::std::unique_ptr<{}> const &ptr) noexcept {{",
inner, instance, inner,
);
writeln!(out, " return ptr.get();");
@@ -1791,7 +1793,7 @@ fn write_shared_ptr(out: &mut OutFile, key: NamedImplKey) {
begin_function_definition(out);
writeln!(
out,
- "void cxxbridge1$shared_ptr${}$clone(const ::std::shared_ptr<{}> &self, ::std::shared_ptr<{}> *ptr) noexcept {{",
+ "void cxxbridge1$shared_ptr${}$clone(::std::shared_ptr<{}> const &self, ::std::shared_ptr<{}> *ptr) noexcept {{",
instance, inner, inner,
);
writeln!(out, " ::new (ptr) ::std::shared_ptr<{}>(self);", inner);
@@ -1799,7 +1801,7 @@ fn write_shared_ptr(out: &mut OutFile, key: NamedImplKey) {
begin_function_definition(out);
writeln!(
out,
- "const {} *cxxbridge1$shared_ptr${}$get(const ::std::shared_ptr<{}> &self) noexcept {{",
+ "{} const *cxxbridge1$shared_ptr${}$get(::std::shared_ptr<{}> const &self) noexcept {{",
inner, instance, inner,
);
writeln!(out, " return self.get();");
@@ -1842,7 +1844,7 @@ fn write_weak_ptr(out: &mut OutFile, key: NamedImplKey) {
begin_function_definition(out);
writeln!(
out,
- "void cxxbridge1$weak_ptr${}$clone(const ::std::weak_ptr<{}> &self, ::std::weak_ptr<{}> *ptr) noexcept {{",
+ "void cxxbridge1$weak_ptr${}$clone(::std::weak_ptr<{}> const &self, ::std::weak_ptr<{}> *ptr) noexcept {{",
instance, inner, inner,
);
writeln!(out, " ::new (ptr) ::std::weak_ptr<{}>(self);", inner);
@@ -1850,7 +1852,7 @@ fn write_weak_ptr(out: &mut OutFile, key: NamedImplKey) {
begin_function_definition(out);
writeln!(
out,
- "void cxxbridge1$weak_ptr${}$downgrade(const ::std::shared_ptr<{}> &shared, ::std::weak_ptr<{}> *weak) noexcept {{",
+ "void cxxbridge1$weak_ptr${}$downgrade(::std::shared_ptr<{}> const &shared, ::std::weak_ptr<{}> *weak) noexcept {{",
instance, inner, inner,
);
writeln!(out, " ::new (weak) ::std::weak_ptr<{}>(shared);", inner);
@@ -1858,7 +1860,7 @@ fn write_weak_ptr(out: &mut OutFile, key: NamedImplKey) {
begin_function_definition(out);
writeln!(
out,
- "void cxxbridge1$weak_ptr${}$upgrade(const ::std::weak_ptr<{}> &weak, ::std::shared_ptr<{}> *shared) noexcept {{",
+ "void cxxbridge1$weak_ptr${}$upgrade(::std::weak_ptr<{}> const &weak, ::std::shared_ptr<{}> *shared) noexcept {{",
instance, inner, inner,
);
writeln!(
@@ -1888,7 +1890,7 @@ fn write_cxx_vector(out: &mut OutFile, key: NamedImplKey) {
writeln!(
out,
- "::std::size_t cxxbridge1$std$vector${}$size(const ::std::vector<{}> &s) noexcept {{",
+ "::std::size_t cxxbridge1$std$vector${}$size(::std::vector<{}> const &s) noexcept {{",
instance, inner,
);
writeln!(out, " return s.size();");