Skip to content

Commit adf53e7

Browse files
committed
ctest: test ctest-next in ctest-test
1 parent 891cb8c commit adf53e7

File tree

19 files changed

+243
-60
lines changed

19 files changed

+243
-60
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ctest-next/src/ast/function.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub struct Fn {
99
#[expect(unused)]
1010
pub(crate) abi: Abi,
1111
pub(crate) ident: BoxStr,
12+
pub(crate) link_name: Option<BoxStr>,
1213
#[expect(unused)]
1314
pub(crate) parameters: Vec<Parameter>,
1415
#[expect(unused)]
@@ -20,4 +21,9 @@ impl Fn {
2021
pub fn ident(&self) -> &str {
2122
&self.ident
2223
}
24+
25+
/// Return the name of the function to be linked C side with.
26+
pub fn link_name(&self) -> Option<&str> {
27+
self.link_name.as_deref()
28+
}
2329
}

ctest-next/src/ast/static_variable.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pub struct Static {
1010
#[expect(unused)]
1111
pub(crate) abi: Abi,
1212
pub(crate) ident: BoxStr,
13+
pub(crate) link_name: Option<BoxStr>,
1314
pub(crate) ty: syn::Type,
1415
}
1516

@@ -18,4 +19,9 @@ impl Static {
1819
pub fn ident(&self) -> &str {
1920
&self.ident
2021
}
22+
23+
/// Return the name of the function to be linked C side with.
24+
pub fn link_name(&self) -> Option<&str> {
25+
self.link_name.as_deref()
26+
}
2127
}

ctest-next/src/ffi_items.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::ops::Deref;
33
use syn::punctuated::Punctuated;
44
use syn::visit::Visit;
55

6-
use crate::{Abi, Const, Field, Fn, Parameter, Static, Struct, Type, Union};
6+
use crate::{Abi, BoxStr, Const, Field, Fn, Parameter, Static, Struct, Type, Union};
77

88
/// Represents a collected set of top-level Rust items relevant to FFI generation or analysis.
99
///
@@ -95,6 +95,30 @@ fn collect_fields(fields: &Punctuated<syn::Field, syn::Token![,]>) -> Vec<Field>
9595
.collect()
9696
}
9797

98+
fn extract_single_link_name(attrs: &Vec<syn::Attribute>) -> Option<BoxStr> {
99+
let mut link_name_iter = attrs
100+
.iter()
101+
.filter(|attr| attr.path().is_ident("link_name"));
102+
103+
let link_name = link_name_iter.next().and_then(|attr| match &attr.meta {
104+
syn::Meta::NameValue(nv) => {
105+
if let syn::Expr::Lit(expr_lit) = &nv.value {
106+
if let syn::Lit::Str(lit_str) = &expr_lit.lit {
107+
return Some(lit_str.value().into_boxed_str());
108+
}
109+
}
110+
None
111+
}
112+
_ => None,
113+
});
114+
115+
if let Some(attr) = link_name_iter.next() {
116+
panic!("multiple `#[link_name = ...]` attributes found: {attr:?}");
117+
}
118+
119+
link_name
120+
}
121+
98122
fn visit_foreign_item_fn(table: &mut FfiItems, i: &syn::ForeignItemFn, abi: &Abi) {
99123
let public = is_visible(&i.vis);
100124
let abi = abi.clone();
@@ -122,11 +146,13 @@ fn visit_foreign_item_fn(table: &mut FfiItems, i: &syn::ForeignItemFn, abi: &Abi
122146
syn::ReturnType::Default => None,
123147
syn::ReturnType::Type(_, ty) => Some(ty.deref().clone()),
124148
};
149+
let link_name = extract_single_link_name(&i.attrs);
125150

126151
table.foreign_functions.push(Fn {
127152
public,
128153
abi,
129154
ident,
155+
link_name,
130156
parameters,
131157
return_type,
132158
});
@@ -137,11 +163,13 @@ fn visit_foreign_item_static(table: &mut FfiItems, i: &syn::ForeignItemStatic, a
137163
let abi = abi.clone();
138164
let ident = i.ident.to_string().into_boxed_str();
139165
let ty = i.ty.deref().clone();
166+
let link_name = extract_single_link_name(&i.attrs);
140167

141168
table.foreign_statics.push(Static {
142169
public,
143170
abi,
144171
ident,
172+
link_name,
145173
ty,
146174
});
147175
}

ctest-next/templates/test.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
mod generated_tests {
1010
#![allow(non_snake_case)]
1111
#![deny(improper_ctypes_definitions)]
12-
use std::ffi::CStr;
12+
use std::ffi::{CStr, c_char};
1313
use std::fmt::{Debug, LowerHex};
1414
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
15+
#[expect(unused_imports)]
1516
use std::{mem, ptr, slice};
1617

1718
use super::*;
@@ -62,7 +63,7 @@ mod generated_tests {
6263

6364
// SAFETY: FFI call returns a valid C string.
6465
let c_val = unsafe {
65-
let c_ptr: *const c_char = unsafe { ctest_const_cstr__{{ const_cstr.id }}() };
66+
let c_ptr: *const c_char = ctest_const_cstr__{{ const_cstr.id }}();
6667
CStr::from_ptr(c_ptr)
6768
};
6869

@@ -89,7 +90,7 @@ mod generated_tests {
8990
};
9091

9192
let c_bytes = unsafe {
92-
let c_ptr: *const T = unsafe { ctest_const__{{ constant.id }}() };
93+
let c_ptr: *const T = ctest_const__{{ constant.id }}();
9394
slice::from_raw_parts(c_ptr.cast::<u8>(), size_of::<T>())
9495
};
9596

ctest-next/tests/input/hierarchy.out.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
mod generated_tests {
77
#![allow(non_snake_case)]
88
#![deny(improper_ctypes_definitions)]
9-
use std::ffi::CStr;
9+
use std::ffi::{CStr, c_char};
1010
use std::fmt::{Debug, LowerHex};
1111
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
12+
#[expect(unused_imports)]
1213
use std::{mem, ptr, slice};
1314

1415
use super::*;
@@ -58,7 +59,7 @@ mod generated_tests {
5859
};
5960

6061
let c_bytes = unsafe {
61-
let c_ptr: *const T = unsafe { ctest_const__ON() };
62+
let c_ptr: *const T = ctest_const__ON();
6263
slice::from_raw_parts(c_ptr.cast::<u8>(), size_of::<T>())
6364
};
6465

ctest-next/tests/input/macro.out.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
mod generated_tests {
77
#![allow(non_snake_case)]
88
#![deny(improper_ctypes_definitions)]
9-
use std::ffi::CStr;
9+
use std::ffi::{CStr, c_char};
1010
use std::fmt::{Debug, LowerHex};
1111
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
12+
#[expect(unused_imports)]
1213
use std::{mem, ptr, slice};
1314

1415
use super::*;

ctest-next/tests/input/simple.out.with-renames.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
mod generated_tests {
77
#![allow(non_snake_case)]
88
#![deny(improper_ctypes_definitions)]
9-
use std::ffi::CStr;
9+
use std::ffi::{CStr, c_char};
1010
use std::fmt::{Debug, LowerHex};
1111
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
12+
#[expect(unused_imports)]
1213
use std::{mem, ptr, slice};
1314

1415
use super::*;
@@ -57,7 +58,7 @@ mod generated_tests {
5758

5859
// SAFETY: FFI call returns a valid C string.
5960
let c_val = unsafe {
60-
let c_ptr: *const c_char = unsafe { ctest_const_cstr__A() };
61+
let c_ptr: *const c_char = ctest_const_cstr__A();
6162
CStr::from_ptr(c_ptr)
6263
};
6364

@@ -80,7 +81,7 @@ mod generated_tests {
8081

8182
// SAFETY: FFI call returns a valid C string.
8283
let c_val = unsafe {
83-
let c_ptr: *const c_char = unsafe { ctest_const_cstr__B() };
84+
let c_ptr: *const c_char = ctest_const_cstr__B();
8485
CStr::from_ptr(c_ptr)
8586
};
8687

ctest-next/tests/input/simple.out.with-skips.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
mod generated_tests {
77
#![allow(non_snake_case)]
88
#![deny(improper_ctypes_definitions)]
9-
use std::ffi::CStr;
9+
use std::ffi::{CStr, c_char};
1010
use std::fmt::{Debug, LowerHex};
1111
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
12+
#[expect(unused_imports)]
1213
use std::{mem, ptr, slice};
1314

1415
use super::*;
@@ -57,7 +58,7 @@ mod generated_tests {
5758

5859
// SAFETY: FFI call returns a valid C string.
5960
let c_val = unsafe {
60-
let c_ptr: *const c_char = unsafe { ctest_const_cstr__A() };
61+
let c_ptr: *const c_char = ctest_const_cstr__A();
6162
CStr::from_ptr(c_ptr)
6263
};
6364

ctest-test/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ edition = "2021"
77

88
[build-dependencies]
99
ctest = { path = "../ctest" }
10+
ctest-next = { path = "../ctest-next" }
1011
cc = "1.2"
1112

1213
[dev-dependencies]
1314
ctest = { path = "../ctest" }
15+
ctest-next = { path = "../ctest-next" }
1416

1517
[dependencies]
1618
cfg-if = "1.0.1"
@@ -24,6 +26,14 @@ test = false
2426
name = "t2"
2527
test = false
2628

29+
[[bin]]
30+
name = "t1_next"
31+
test = false
32+
33+
[[bin]]
34+
name = "t2_next"
35+
test = false
36+
2737
[[bin]]
2838
name = "t1_cxx"
2939
test = false

0 commit comments

Comments
 (0)