Index: runtime/vm/flow_graph_compiler_x64.cc |
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc |
index 3bb98222d23f1cf9e26983f0185bffb335bb044c..59fed95ea7312340dd1259c15a917b0dc765381a 100644 |
--- a/runtime/vm/flow_graph_compiler_x64.cc |
+++ b/runtime/vm/flow_graph_compiler_x64.cc |
@@ -533,6 +533,11 @@ RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof( |
Label* is_instance_lbl, |
Label* is_not_instance_lbl) { |
__ Comment("InlineInstanceof"); |
+ if (type.IsVoidType()) { |
+ // A non-null value is returned from a void function, which will result in a |
+ // type error. A null value is handled prior to executing this inline code. |
+ return SubtypeTestCache::null(); |
+ } |
if (type.IsInstantiated()) { |
const Class& type_class = Class::ZoneHandle(zone(), type.type_class()); |
// A class equality check is only applicable with a dst type (not a |
@@ -575,7 +580,7 @@ void FlowGraphCompiler::GenerateInstanceOf(TokenPosition token_pos, |
const AbstractType& type, |
LocationSummary* locs) { |
ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded()); |
- ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType()); |
+ ASSERT(!type.IsObjectType() && !type.IsDynamicType()); |
__ pushq(RDX); // Store instantiator type arguments. |
__ pushq(RCX); // Store function type arguments. |
@@ -584,8 +589,8 @@ void FlowGraphCompiler::GenerateInstanceOf(TokenPosition token_pos, |
// If type is instantiated and non-parameterized, we can inline code |
// checking whether the tested instance is a Smi. |
if (type.IsInstantiated()) { |
- // A null object is only an instance of Null, Object, void and dynamic. |
- // Object void and dynamic have already been checked above (if the type is |
+ // A null object is only an instance of Null, Object, and dynamic. |
+ // Object and dynamic have already been checked above (if the type is |
// instantiated). So we can return false here if the instance is null, |
// unless the type is Null (and if the type is instantiated). |
// We can only inline this null check if the type is instantiated at compile |
@@ -654,8 +659,7 @@ void FlowGraphCompiler::GenerateAssertAssignable(TokenPosition token_pos, |
ASSERT(dst_type.IsFinalized()); |
// Assignable check is skipped in FlowGraphBuilder, not here. |
ASSERT(dst_type.IsMalformedOrMalbounded() || |
- (!dst_type.IsDynamicType() && !dst_type.IsObjectType() && |
- !dst_type.IsVoidType())); |
+ (!dst_type.IsDynamicType() && !dst_type.IsObjectType())); |
__ pushq(RDX); // Store instantiator type arguments. |
__ pushq(RCX); // Store function type arguments. |
// A null object is always assignable and is returned as result. |