| Index: runtime/vm/parser.cc
|
| ===================================================================
|
| --- runtime/vm/parser.cc (revision 15232)
|
| +++ runtime/vm/parser.cc (working copy)
|
| @@ -2545,7 +2545,8 @@
|
| const intptr_t type_pos = TokenPos();
|
| const AbstractType& type = AbstractType::Handle(
|
| ParseType(ClassFinalizer::kTryResolve));
|
| - if (type.IsTypeParameter() || type.IsDynamicType()) {
|
| + if (!type.IsMalformed() &&
|
| + (type.IsTypeParameter() || type.IsDynamicType())) {
|
| // Replace the type with a malformed type and compile a throw when called.
|
| redirection_type = ClassFinalizer::NewFinalizedMalformedType(
|
| Error::Handle(), // No previous error.
|
| @@ -3741,10 +3742,7 @@
|
| // Map a malformed type argument to dynamic, so that malformed types with
|
| // a resolved type class are handled properly in production mode.
|
| if (type.IsMalformed()) {
|
| - ASSERT(finalization != ClassFinalizer::kCanonicalizeWellFormed);
|
| - if (finalization == ClassFinalizer::kCanonicalizeForCreation) {
|
| - ErrorMsg(*malformed_error);
|
| - }
|
| + ASSERT(finalization < ClassFinalizer::kCanonicalizeWellFormed);
|
| type = Type::DynamicType();
|
| }
|
| types.Add(type);
|
| @@ -6188,6 +6186,8 @@
|
| catch_seen = true;
|
| if (IsLiteral("on")) {
|
| ConsumeToken();
|
| + // TODO(regis): The spec may change in the way a malformed 'on' type is
|
| + // treated. For now, we require the type to be wellformed.
|
| exception_param.type = &AbstractType::ZoneHandle(
|
| ParseType(ClassFinalizer::kCanonicalizeWellFormed));
|
| } else {
|
| @@ -6844,8 +6844,8 @@
|
| op_kind = Token::kISNOT;
|
| }
|
| const intptr_t type_pos = TokenPos();
|
| - const AbstractType& type =
|
| - AbstractType::ZoneHandle(ParseType(ClassFinalizer::kCanonicalize));
|
| + const AbstractType& type = AbstractType::ZoneHandle(
|
| + ParseType(ClassFinalizer::kCanonicalizeExpression));
|
| if (!type.IsInstantiated() &&
|
| (current_block_->scope->function_level() > 0)) {
|
| // Make sure that the instantiator is captured.
|
| @@ -7811,10 +7811,14 @@
|
| }
|
| // Resolve classname in the scope of the current library.
|
| Error& error = Error::Handle();
|
| - resolved_type_class =
|
| - ResolveClassInCurrentLibraryScope(unresolved_class.token_pos(),
|
| - unresolved_class_name,
|
| - &error);
|
| + // If we finalize a type expression, as opposed to a type annotation, we
|
| + // tell the resolver (by passing NULL) to immediately report an ambiguous
|
| + // type as a compile time error.
|
| + resolved_type_class = ResolveClassInCurrentLibraryScope(
|
| + unresolved_class.token_pos(),
|
| + unresolved_class_name,
|
| + finalization >= ClassFinalizer::kCanonicalizeExpression ?
|
| + NULL : &error);
|
| if (!error.IsNull()) {
|
| *type = ClassFinalizer::NewFinalizedMalformedType(
|
| error,
|
| @@ -7830,11 +7834,15 @@
|
| LibraryPrefix::Handle(unresolved_class.library_prefix());
|
| // Resolve class name in the scope of the library prefix.
|
| Error& error = Error::Handle();
|
| - resolved_type_class =
|
| - ResolveClassInPrefixScope(unresolved_class.token_pos(),
|
| - lib_prefix,
|
| - unresolved_class_name,
|
| - &error);
|
| + // If we finalize a type expression, as opposed to a type annotation, we
|
| + // tell the resolver (by passing NULL) to immediately report an ambiguous
|
| + // type as a compile time error.
|
| + resolved_type_class = ResolveClassInPrefixScope(
|
| + unresolved_class.token_pos(),
|
| + lib_prefix,
|
| + unresolved_class_name,
|
| + finalization >= ClassFinalizer::kCanonicalizeExpression ?
|
| + NULL : &error);
|
| if (!error.IsNull()) {
|
| *type = ClassFinalizer::NewFinalizedMalformedType(
|
| error,
|
| @@ -9107,11 +9115,10 @@
|
| }
|
| intptr_t type_pos = TokenPos();
|
| AbstractType& type = AbstractType::Handle(
|
| - ParseType(ClassFinalizer::kCanonicalizeForCreation));
|
| + ParseType(ClassFinalizer::kCanonicalizeExpression));
|
| // In case the type is malformed, throw a dynamic type error after finishing
|
| // parsing the instance creation expression.
|
| - if (type.IsTypeParameter() || type.IsDynamicType()) {
|
| - ASSERT(!type.IsMalformed());
|
| + if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
|
| // Replace the type with a malformed type.
|
| type = ClassFinalizer::NewFinalizedMalformedType(
|
| Error::Handle(), // No previous error.
|
|
|