about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorCelina G. Val <celinval@amazon.com>2023-12-19 11:04:34 -0800
committerCelina G. Val <celinval@amazon.com>2023-12-19 11:04:34 -0800
commit76b3e6de558cc67dca0098def00b0ee55dfc8d58 (patch)
treeb36ed88fc8cd527128cf735a91476f654418bd7d /tests
parent1a83c5b55bdad84baca69d121d9c3e6f357e8570 (diff)
downloadrust-76b3e6de558cc67dca0098def00b0ee55dfc8d58.tar.gz
rust-76b3e6de558cc67dca0098def00b0ee55dfc8d58.zip
Fix c_variadic flag and add opaque info to PassMode
We should expand the information in PassMode later.
Diffstat (limited to 'tests')
-rw-r--r--tests/ui-fulldeps/stable-mir/check_abi.rs (renamed from tests/ui-fulldeps/stable-mir/check_layout.rs)34
1 files changed, 30 insertions, 4 deletions
diff --git a/tests/ui-fulldeps/stable-mir/check_layout.rs b/tests/ui-fulldeps/stable-mir/check_abi.rs
index 1c33103b0fe..30b42bc3bfa 100644
--- a/tests/ui-fulldeps/stable-mir/check_layout.rs
+++ b/tests/ui-fulldeps/stable-mir/check_abi.rs
@@ -23,7 +23,7 @@ use rustc_middle::ty::TyCtxt;
 use rustc_smir::rustc_internal;
 use stable_mir::abi::{ArgAbi, CallConvention, FieldsShape, PassMode, VariantsShape};
 use stable_mir::mir::mono::Instance;
-use stable_mir::{CrateDef, CrateItems, ItemKind};
+use stable_mir::{CrateDef, CrateItem, CrateItems, ItemKind};
 use std::assert_matches::assert_matches;
 use std::convert::TryFrom;
 use std::io::Write;
@@ -35,6 +35,8 @@ const CRATE_NAME: &str = "input";
 fn test_stable_mir(_tcx: TyCtxt<'_>) -> ControlFlow<()> {
     // Find items in the local crate.
     let items = stable_mir::all_local_items();
+
+    // Test fn_abi
     let target_fn = *get_item(&items, (ItemKind::Fn, "fn_abi")).unwrap();
     let instance = Instance::try_from(target_fn).unwrap();
     let fn_abi = instance.fn_abi().unwrap();
@@ -45,9 +47,26 @@ fn test_stable_mir(_tcx: TyCtxt<'_>) -> ControlFlow<()> {
     check_primitive(&fn_abi.args[1]);
     check_result(fn_abi.ret);
 
+    // Test variadic function.
+    let variadic_fn = *get_item(&items, (ItemKind::Fn, "variadic_fn")).unwrap();
+    check_variadic(variadic_fn);
+
     ControlFlow::Continue(())
 }
 
+/// Check the variadic function ABI:
+/// ```no_run
+/// pub unsafe extern "C" fn variadic_fn(n: usize, mut args: ...) -> usize {
+///     0
+/// }
+/// ```
+fn check_variadic(variadic_fn: CrateItem) {
+    let instance = Instance::try_from(variadic_fn).unwrap();
+    let abi = instance.fn_abi().unwrap();
+    assert!(abi.c_variadic);
+    assert_eq!(abi.args.len(), 1);
+}
+
 /// Check the argument to be ignored: `ignore: [u8; 0]`.
 fn check_ignore(abi: &ArgAbi) {
     assert!(abi.ty.kind().is_array());
@@ -60,7 +79,7 @@ fn check_ignore(abi: &ArgAbi) {
 /// Check the primitive argument: `primitive: char`.
 fn check_primitive(abi: &ArgAbi) {
     assert!(abi.ty.kind().is_char());
-    assert_eq!(abi.mode, PassMode::Direct);
+    assert_matches!(abi.mode, PassMode::Direct(_));
     let layout = abi.layout.shape();
     assert!(layout.is_sized());
     assert!(!layout.is_1zst());
@@ -70,7 +89,7 @@ fn check_primitive(abi: &ArgAbi) {
 /// Check the return value: `Result<usize, &str>`.
 fn check_result(abi: ArgAbi) {
     assert!(abi.ty.kind().is_enum());
-    assert_eq!(abi.mode, PassMode::Indirect);
+    assert_matches!(abi.mode, PassMode::Indirect { .. });
     let layout = abi.layout.shape();
     assert!(layout.is_sized());
     assert_matches!(layout.fields, FieldsShape::Arbitrary { .. });
@@ -106,11 +125,18 @@ fn generate_input(path: &str) -> std::io::Result<()> {
     write!(
         file,
         r#"
-        #[allow(unused_variables)]
+        #![feature(c_variadic)]
+        #![allow(unused_variables)]
+
         pub fn fn_abi(ignore: [u8; 0], primitive: char) -> Result<usize, &'static str> {{
             // We only care about the signature.
             todo!()
         }}
+
+
+        pub unsafe extern "C" fn variadic_fn(n: usize, mut args: ...) -> usize {{
+            0
+        }}
         "#
     )?;
     Ok(())