Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index f9fd601a32029902b9ae1254f2f69e67c41cc6bb..1a91fcb710236e16bcbca83c3c4db01820a2587d 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -2071,7 +2071,9 @@ void Parser::ParseFormalParameter(bool allow_explicit_default_value, |
} |
// Now that type parameters are declared, the result type can be resolved. |
- ResolveType(ClassFinalizer::kResolveTypeParameters, &result_type); |
+ ResolveType(is_top_level_ ? ClassFinalizer::kResolveTypeParameters |
+ : ClassFinalizer::kCanonicalize, |
+ &result_type); |
ASSERT(CurrentToken() == Token::kLPAREN); |
ParamList func_params; |
@@ -2108,11 +2110,12 @@ void Parser::ParseFormalParameter(bool allow_explicit_default_value, |
} else { |
if (!parameter.type->IsFinalized()) { |
AbstractType& type = AbstractType::ZoneHandle(Z, parameter.type->raw()); |
- ResolveType(ClassFinalizer::kResolveTypeParameters, &type); |
- if (!is_top_level_) { |
- type = ClassFinalizer::FinalizeType( |
- Class::Handle(Z, innermost_function().origin()), type, |
- ClassFinalizer::kCanonicalize); |
+ if (is_top_level_) { |
+ ResolveType(ClassFinalizer::kResolveTypeParameters, &type); |
+ } else { |
+ ResolveType(ClassFinalizer::kCanonicalize, &type); |
+ type = ClassFinalizer::FinalizeType(current_class(), type, |
+ ClassFinalizer::kCanonicalize); |
} |
parameter.type = &type; |
} |
@@ -7673,7 +7676,7 @@ AstNode* Parser::ParseFunctionStatement(bool is_literal) { |
if (!found_func && !result_type.IsFinalized()) { |
// Now that type parameters are declared, the result type can be resolved |
// and finalized. |
- ResolveType(ClassFinalizer::kResolveTypeParameters, &result_type); |
+ ResolveType(ClassFinalizer::kCanonicalize, &result_type); |
result_type = ClassFinalizer::FinalizeType(current_class(), result_type, |
ClassFinalizer::kCanonicalize); |
function.set_result_type(result_type); |
@@ -11917,6 +11920,8 @@ void Parser::ResolveType(ClassFinalizer::FinalizationKind finalization, |
// The referenced class may not have been parsed yet. It would be wrong |
// to resolve it too early to an imported class of the same name. Only |
// resolve the class when a finalized type is requested. |
+ // Note that when compiling a cloned mixin function, library_ may be |
+ // different than current_class's library. |
if (finalization > ClassFinalizer::kResolveTypeParameters) { |
resolved_type_class = library_.LookupClass(unresolved_class_name); |
} |