Skip to content

Commit bc87b2a

Browse files
committed
Make abi optional for FunctionSig
1 parent 8128b2a commit bc87b2a

File tree

2 files changed

+19
-13
lines changed

2 files changed

+19
-13
lines changed

src/codegen/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -2164,7 +2164,7 @@ impl ToRustTy for FunctionSig {
21642164

21652165
let fnty = ast::TyKind::BareFn(P(ast::BareFnTy {
21662166
unsafety: ast::Unsafety::Unsafe,
2167-
abi: self.abi(),
2167+
abi: self.abi().expect("Invalid abi for function!"),
21682168
lifetimes: vec![],
21692169
decl: decl,
21702170
}));
@@ -2244,7 +2244,8 @@ impl CodeGenerator for Function {
22442244
vis: ast::Visibility::Public,
22452245
};
22462246

2247-
let item = ForeignModBuilder::new(signature.abi())
2247+
let item = ForeignModBuilder::new(signature.abi()
2248+
.expect("Invalid abi for function!"))
22482249
.with_foreign_item(foreign_item)
22492250
.build(ctx);
22502251

src/ir/function.rs

+16-11
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,19 @@ pub struct FunctionSig {
7373
is_variadic: bool,
7474

7575
/// The ABI of this function.
76-
abi: abi::Abi,
76+
abi: Option<abi::Abi>,
7777
}
7878

79-
fn get_abi(cc: CXCallingConv) -> abi::Abi {
79+
fn get_abi(cc: CXCallingConv) -> Option<abi::Abi> {
8080
use clang_sys::*;
8181
match cc {
82-
CXCallingConv_Default => abi::Abi::C,
83-
CXCallingConv_C => abi::Abi::C,
84-
CXCallingConv_X86StdCall => abi::Abi::Stdcall,
85-
CXCallingConv_X86FastCall => abi::Abi::Fastcall,
86-
CXCallingConv_AAPCS => abi::Abi::Aapcs,
87-
CXCallingConv_X86_64Win64 => abi::Abi::Win64,
88-
CXCallingConv_Invalid => abi::Abi::C, // TODO:
82+
CXCallingConv_Default => Some(abi::Abi::C),
83+
CXCallingConv_C => Some(abi::Abi::C),
84+
CXCallingConv_X86StdCall => Some(abi::Abi::Stdcall),
85+
CXCallingConv_X86FastCall => Some(abi::Abi::Fastcall),
86+
CXCallingConv_AAPCS => Some(abi::Abi::Aapcs),
87+
CXCallingConv_X86_64Win64 => Some(abi::Abi::Win64),
88+
CXCallingConv_Invalid => None,
8989
other => panic!("unsupported calling convention: {:?}", other),
9090
}
9191
}
@@ -117,7 +117,7 @@ impl FunctionSig {
117117
pub fn new(return_type: ItemId,
118118
arguments: Vec<(Option<String>, ItemId)>,
119119
is_variadic: bool,
120-
abi: abi::Abi)
120+
abi: Option<abi::Abi>)
121121
-> Self {
122122
FunctionSig {
123123
return_type: return_type,
@@ -228,6 +228,11 @@ impl FunctionSig {
228228
let ret = Item::from_ty_or_ref(ty_ret_type, None, None, ctx);
229229
let abi = get_abi(ty.call_conv());
230230

231+
if abi.is_none() {
232+
assert_eq!(cursor.kind(), CXCursor_ObjCInstanceMethodDecl,
233+
"Invalid ABI for function signature")
234+
}
235+
231236
Ok(Self::new(ret, args, ty.is_variadic(), abi))
232237
}
233238

@@ -242,7 +247,7 @@ impl FunctionSig {
242247
}
243248

244249
/// Get this function signature's ABI.
245-
pub fn abi(&self) -> abi::Abi {
250+
pub fn abi(&self) -> Option<abi::Abi> {
246251
self.abi
247252
}
248253

0 commit comments

Comments
 (0)