summaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/mod.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index b8893f9c..15885d57 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -26,7 +26,7 @@ use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault,
CanDerivePartialEq, CanDeriveEq, CanDerive};
use ir::dot;
use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue};
-use ir::function::{Abi, Function, FunctionSig, Linkage};
+use ir::function::{Abi, Function, FunctionKind, FunctionSig, Linkage};
use ir::int::IntKind;
use ir::item::{IsOpaque, Item, ItemCanonicalName, ItemCanonicalPath};
use ir::item_kind::ItemKind;
@@ -1878,13 +1878,8 @@ impl CodeGenerator for CompInfo {
}
if ctx.options().codegen_config.destructors {
- if let Some((is_virtual, destructor)) = self.destructor() {
- let kind = if is_virtual {
- MethodKind::VirtualDestructor
- } else {
- MethodKind::Destructor
- };
-
+ if let Some((kind, destructor)) = self.destructor() {
+ debug_assert!(kind.is_destructor());
Method::new(kind, destructor, false).codegen_method(
ctx,
&mut methods,
@@ -1990,9 +1985,9 @@ impl MethodCodegen for Method {
match self.kind() {
MethodKind::Constructor => cc.constructors,
MethodKind::Destructor => cc.destructors,
- MethodKind::VirtualDestructor => cc.destructors,
+ MethodKind::VirtualDestructor { .. } => cc.destructors,
MethodKind::Static | MethodKind::Normal |
- MethodKind::Virtual => cc.methods,
+ MethodKind::Virtual { .. } => cc.methods,
}
});
@@ -3174,6 +3169,15 @@ impl CodeGenerator for Function {
Linkage::External => {}
}
+ // Pure virtual methods have no actual symbol, so we can't generate
+ // something meaningful for them.
+ match self.kind() {
+ FunctionKind::Method(ref method_kind) if method_kind.is_pure_virtual() => {
+ return;
+ }
+ _ => {},
+ }
+
// Similar to static member variables in a class template, we can't
// generate bindings to template functions, because the set of
// instantiations is open ended and we have no way of knowing which