Version 2.10.0-89.0.dev

Merge commit 'ab16d79af97b837b168672e593b3a3c613ecba41' into 'dev'
diff --git a/DEPS b/DEPS
index a31cd21..2e5429d 100644
--- a/DEPS
+++ b/DEPS
@@ -39,12 +39,12 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.10.0-3.0.dev",
+  "sdk_tag": "version:2.10.0-79.0.dev",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "12855e59cd7e031d076cc8cece9f5ee08e77ca8c",
+  "co19_rev": "9c07e26d67665de7972ba6f7e87369933a978545",
   "co19_2_rev": "e48b3090826cf40b8037648f19d211e8eab1b4b6",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 7e0865d..3cd5e84 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -6608,6 +6608,27 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNonVoidReturnOperator = messageNonVoidReturnOperator;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNonVoidReturnOperator = const MessageCode(
+    "NonVoidReturnOperator",
+    analyzerCodes: <String>["NON_VOID_RETURN_FOR_OPERATOR"],
+    message: r"""The return type of the operator []= must be 'void'.""",
+    tip: r"""Try changing the return type to 'void'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeNonVoidReturnSetter = messageNonVoidReturnSetter;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageNonVoidReturnSetter = const MessageCode(
+    "NonVoidReturnSetter",
+    analyzerCodes: <String>["NON_VOID_RETURN_FOR_SETTER"],
+    message: r"""The return type of the setter must be 'void' or absent.""",
+    tip:
+        r"""Try removing the return type, or define a method rather than a setter.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeNotAConstantExpression = messageNotAConstantExpression;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart
similarity index 85%
rename from pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart
rename to pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart
index be14b32..24d258e 100644
--- a/pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart
@@ -12,10 +12,11 @@
 
 import 'type_declaration_builder.dart';
 
-abstract class BuiltinTypeBuilder extends TypeDeclarationBuilderImpl {
+abstract class BuiltinTypeDeclarationBuilder
+    extends TypeDeclarationBuilderImpl {
   final DartType type;
 
-  BuiltinTypeBuilder(
+  BuiltinTypeDeclarationBuilder(
       String name, this.type, LibraryBuilder compilationUnit, int charOffset)
       : super(null, 0, name, compilationUnit, charOffset);
 
@@ -30,5 +31,5 @@
     return type.withDeclaredNullability(nullability);
   }
 
-  String get debugName => "BuiltinTypeBuilder";
+  String get debugName => "BuiltinTypeDeclarationBuilder";
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 926b2ff..a189dc1 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -84,14 +84,14 @@
 import 'member_builder.dart';
 import 'metadata_builder.dart';
 import 'named_type_builder.dart';
-import 'never_type_builder.dart';
+import 'never_type_declaration_builder.dart';
 import 'nullability_builder.dart';
 import 'procedure_builder.dart';
 import 'type_alias_builder.dart';
 import 'type_builder.dart';
 import 'type_declaration_builder.dart';
 import 'type_variable_builder.dart';
-import 'void_type_builder.dart';
+import 'void_type_declaration_builder.dart';
 
 abstract class ClassBuilder implements DeclarationBuilder {
   /// The type variables declared on a class, extension or mixin declaration.
@@ -687,9 +687,9 @@
       }
       // TODO(eernst): Should gather 'restricted supertype' checks in one place,
       // e.g., dynamic/int/String/Null and more are checked elsewhere.
-      if (decl is VoidTypeBuilder) {
+      if (decl is VoidTypeDeclarationBuilder) {
         fail(superClassType, messageExtendsVoid, aliasBuilder);
-      } else if (decl is NeverTypeBuilder) {
+      } else if (decl is NeverTypeDeclarationBuilder) {
         fail(superClassType, messageExtendsNever, aliasBuilder);
       } else if (decl is ClassBuilder) {
         superClass = decl;
@@ -737,9 +737,9 @@
         }
         if (decl != superClass) {
           // TODO(eernst): Have all 'restricted supertype' checks in one place.
-          if (decl is VoidTypeBuilder) {
+          if (decl is VoidTypeDeclarationBuilder) {
             fail(type, messageImplementsVoid, aliasBuilder);
-          } else if (decl is NeverTypeBuilder) {
+          } else if (decl is NeverTypeDeclarationBuilder) {
             fail(type, messageImplementsNever, aliasBuilder);
           }
         }
diff --git a/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart
similarity index 68%
rename from pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
rename to pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart
index b5c377c..b5e9b80 100644
--- a/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart
@@ -6,13 +6,13 @@
 
 import 'package:kernel/ast.dart' show DartType;
 
-import 'builtin_type_builder.dart';
+import 'builtin_type_declaration_builder.dart';
 import 'library_builder.dart';
 
-class DynamicTypeBuilder extends BuiltinTypeBuilder {
-  DynamicTypeBuilder(
+class DynamicTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
+  DynamicTypeDeclarationBuilder(
       DartType type, LibraryBuilder compilationUnit, int charOffset)
       : super("dynamic", type, compilationUnit, charOffset);
 
-  String get debugName => "DynamicTypeBuilder";
+  String get debugName => "DynamicTypeDeclarationBuilder";
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 9580da7..cd62848 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -128,19 +128,39 @@
     assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
     // TODO(ahe): These types shouldn't be looked up in scope, they come
     // directly from dart:core.
-    TypeBuilder intType =
-        new NamedTypeBuilder("int", const NullabilityBuilder.omitted(), null);
+    TypeBuilder intType = new NamedTypeBuilder(
+        "int",
+        const NullabilityBuilder.omitted(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     TypeBuilder stringType = new NamedTypeBuilder(
-        "String", const NullabilityBuilder.omitted(), null);
+        "String",
+        const NullabilityBuilder.omitted(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     NamedTypeBuilder objectType = new NamedTypeBuilder(
-        "Object", const NullabilityBuilder.omitted(), null);
+        "Object",
+        const NullabilityBuilder.omitted(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     Class cls = new Class(name: name, reference: referencesFrom?.reference);
     Map<String, MemberBuilder> members = <String, MemberBuilder>{};
     Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
-    NamedTypeBuilder selfType =
-        new NamedTypeBuilder(name, const NullabilityBuilder.omitted(), null);
+    NamedTypeBuilder selfType = new NamedTypeBuilder(
+        name,
+        const NullabilityBuilder.omitted(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     TypeBuilder listType = new NamedTypeBuilder(
-        "List", const NullabilityBuilder.omitted(), <TypeBuilder>[selfType]);
+        "List",
+        const NullabilityBuilder.omitted(),
+        <TypeBuilder>[selfType],
+        /* fileUri = */ null,
+        /* charOffset = */ null);
 
     /// metadata class E {
     ///   final int index;
diff --git a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
index 7675648..d6eb954 100644
--- a/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/fixed_type_builder.dart
@@ -11,8 +11,10 @@
 
 class FixedTypeBuilder extends TypeBuilder {
   final DartType type;
+  final Uri fileUri;
+  final int charOffset;
 
-  const FixedTypeBuilder(this.type);
+  const FixedTypeBuilder(this.type, this.fileUri, this.charOffset);
 
   TypeBuilder clone(List<TypeBuilder> newTypes) => this;
 
@@ -23,6 +25,8 @@
 
   String get debugName => 'FixedTypeBuilder';
 
+  bool get isVoidType => type is VoidType;
+
   StringBuffer printOn(StringBuffer buffer) {
     buffer.write('type=${type}');
     return buffer;
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index 027d8c3..f56ac53 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -27,9 +27,11 @@
   final List<TypeVariableBuilder> typeVariables;
   final List<FormalParameterBuilder> formals;
   final NullabilityBuilder nullabilityBuilder;
+  final Uri fileUri;
+  final int charOffset;
 
   FunctionTypeBuilder(this.returnType, this.typeVariables, this.formals,
-      this.nullabilityBuilder);
+      this.nullabilityBuilder, this.fileUri, this.charOffset);
 
   @override
   String get name => null;
@@ -37,6 +39,8 @@
   @override
   String get debugName => "Function";
 
+  bool get isVoidType => false;
+
   @override
   StringBuffer printOn(StringBuffer buffer) {
     if (typeVariables != null) {
@@ -143,14 +147,16 @@
         returnType?.clone(newTypes),
         clonedTypeVariables,
         clonedFormals,
-        nullabilityBuilder);
+        nullabilityBuilder,
+        fileUri,
+        charOffset);
     newTypes.add(newType);
     return newType;
   }
 
   FunctionTypeBuilder withNullabilityBuilder(
       NullabilityBuilder nullabilityBuilder) {
-    return new FunctionTypeBuilder(
-        returnType, typeVariables, formals, nullabilityBuilder);
+    return new FunctionTypeBuilder(returnType, typeVariables, formals,
+        nullabilityBuilder, fileUri, charOffset);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/future_or_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart
similarity index 82%
rename from pkg/front_end/lib/src/fasta/builder/future_or_type_builder.dart
rename to pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart
index fc823fc..bc3c296 100644
--- a/pkg/front_end/lib/src/fasta/builder/future_or_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart
@@ -6,17 +6,17 @@
 
 import 'package:kernel/ast.dart' show DartType, FutureOrType, Nullability;
 
-import 'builtin_type_builder.dart';
+import 'builtin_type_declaration_builder.dart';
 import 'library_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
-class FutureOrTypeBuilder extends BuiltinTypeBuilder {
-  FutureOrTypeBuilder(
+class FutureOrTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
+  FutureOrTypeDeclarationBuilder(
       DartType type, LibraryBuilder compilationUnit, int charOffset)
       : super("FutureOr", type, compilationUnit, charOffset);
 
-  String get debugName => "FutureOrTypeBuilder";
+  String get debugName => "FutureOrTypeDeclarationBuilder";
 
   DartType buildType(LibraryBuilder library,
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
diff --git a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
index 1991aed..e78679d 100644
--- a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
@@ -16,11 +16,14 @@
 class MixinApplicationBuilder extends TypeBuilder {
   final TypeBuilder supertype;
   final List<TypeBuilder> mixins;
+  final Uri fileUri;
+  final int charOffset;
   Supertype builtType;
 
   List<TypeVariableBuilder> typeVariables;
 
-  MixinApplicationBuilder(this.supertype, this.mixins);
+  MixinApplicationBuilder(
+      this.supertype, this.mixins, this.fileUri, this.charOffset);
 
   String get name => null;
 
@@ -30,6 +33,8 @@
 
   String get debugName => "MixinApplicationBuilder";
 
+  bool get isVoidType => false;
+
   StringBuffer printOn(StringBuffer buffer) {
     buffer.write(supertype);
     buffer.write(" with ");
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 0ab1b7f..dec0428 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -47,7 +47,7 @@
 import '../scope.dart';
 
 import 'builder.dart';
-import 'builtin_type_builder.dart';
+import 'builtin_type_declaration_builder.dart';
 import 'class_builder.dart';
 import 'invalid_type_declaration_builder.dart';
 import 'library_builder.dart';
@@ -57,6 +57,7 @@
 import 'type_builder.dart';
 import 'type_declaration_builder.dart';
 import 'type_variable_builder.dart';
+import 'void_type_declaration_builder.dart';
 
 class NamedTypeBuilder extends TypeBuilder {
   final Object name;
@@ -65,20 +66,25 @@
 
   final NullabilityBuilder nullabilityBuilder;
 
+  @override
   final Uri fileUri;
+
+  @override
   final int charOffset;
 
   @override
   TypeDeclarationBuilder declaration;
 
   NamedTypeBuilder(this.name, this.nullabilityBuilder, this.arguments,
-      [this.fileUri, this.charOffset]);
+      this.fileUri, this.charOffset);
 
   NamedTypeBuilder.fromTypeDeclarationBuilder(
       this.declaration, this.nullabilityBuilder,
       [this.arguments, this.fileUri, this.charOffset])
       : this.name = declaration.name;
 
+  bool get isVoidType => declaration is VoidTypeDeclarationBuilder;
+
   @override
   void bind(TypeDeclarationBuilder declaration) {
     this.declaration = declaration?.origin;
@@ -344,8 +350,8 @@
         i++;
       }
       if (arguments != null) {
-        NamedTypeBuilder result =
-            new NamedTypeBuilder(name, nullabilityBuilder, arguments);
+        NamedTypeBuilder result = new NamedTypeBuilder(
+            name, nullabilityBuilder, arguments, fileUri, charOffset);
         if (declaration != null) {
           result.bind(declaration);
         } else {
@@ -365,9 +371,9 @@
         clonedArguments[i] = arguments[i].clone(newTypes);
       }
     }
-    NamedTypeBuilder newType =
-        new NamedTypeBuilder(name, nullabilityBuilder, clonedArguments);
-    if (declaration is BuiltinTypeBuilder) {
+    NamedTypeBuilder newType = new NamedTypeBuilder(
+        name, nullabilityBuilder, clonedArguments, fileUri, charOffset);
+    if (declaration is BuiltinTypeDeclarationBuilder) {
       newType.declaration = declaration;
     } else {
       newTypes.add(newType);
@@ -377,7 +383,8 @@
 
   NamedTypeBuilder withNullabilityBuilder(
       NullabilityBuilder nullabilityBuilder) {
-    return new NamedTypeBuilder(name, nullabilityBuilder, arguments)
+    return new NamedTypeBuilder(
+        name, nullabilityBuilder, arguments, fileUri, charOffset)
       ..bind(declaration);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
similarity index 81%
rename from pkg/front_end/lib/src/fasta/builder/never_type_builder.dart
rename to pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
index 49a9dc0..d91935f 100644
--- a/pkg/front_end/lib/src/fasta/builder/never_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
@@ -6,17 +6,17 @@
 
 import 'package:kernel/ast.dart' show DartType, Nullability;
 
-import 'builtin_type_builder.dart';
+import 'builtin_type_declaration_builder.dart';
 import 'library_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
-class NeverTypeBuilder extends BuiltinTypeBuilder {
-  NeverTypeBuilder(
+class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
+  NeverTypeDeclarationBuilder(
       DartType type, LibraryBuilder compilationUnit, int charOffset)
       : super("Never", type, compilationUnit, charOffset);
 
-  String get debugName => "NeverTypeBuilder";
+  String get debugName => "NeverTypeDeclarationBuilder";
 
   DartType buildType(LibraryBuilder library,
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
index 01d5a33..d1ff518 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -17,6 +17,14 @@
 
   TypeDeclarationBuilder get declaration => null;
 
+  /// Returns the Uri for the file in which this type annotation occurred, or
+  /// `null` if the type was synthesized.
+  Uri get fileUri;
+
+  /// Returns the character offset with [fileUri] at which this type annotation
+  /// occurred, or `null` if the type was synthesized.
+  int get charOffset;
+
   void resolveIn(
       Scope scope, int charOffset, Uri fileUri, LibraryBuilder library) {}
 
@@ -64,4 +72,6 @@
       LibraryBuilder library, int charOffset, Uri fileUri);
 
   TypeBuilder withNullabilityBuilder(NullabilityBuilder nullabilityBuilder);
+
+  bool get isVoidType;
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart
deleted file mode 100644
index 9d0478d..0000000
--- a/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library fasta.void_type_builder;
-
-import 'package:kernel/ast.dart' show DartType;
-
-import 'builtin_type_builder.dart';
-import 'library_builder.dart';
-
-class VoidTypeBuilder extends BuiltinTypeBuilder {
-  VoidTypeBuilder(DartType type, LibraryBuilder compilationUnit, int charOffset)
-      : super("void", type, compilationUnit, charOffset);
-
-  String get debugName => "VoidTypeBuilder";
-}
diff --git a/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart
new file mode 100644
index 0000000..25c6760
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.void_type_builder;
+
+import 'package:kernel/ast.dart' show DartType;
+
+import 'builtin_type_declaration_builder.dart';
+import 'library_builder.dart';
+
+class VoidTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
+  VoidTypeDeclarationBuilder(
+      DartType type, LibraryBuilder compilationUnit, int charOffset)
+      : super("void", type, compilationUnit, charOffset);
+
+  String get debugName => "VoidTypeDeclarationBuilder";
+}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index be09ade..07ed03c 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -31,10 +31,10 @@
 
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
-import '../builder/dynamic_type_builder.dart';
+import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/extension_builder.dart';
 import '../builder/modifier_builder.dart';
-import '../builder/never_type_builder.dart';
+import '../builder/never_type_declaration_builder.dart';
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/member_builder.dart';
@@ -151,14 +151,14 @@
   String get name => library.name;
 
   void addSyntheticDeclarationOfDynamic() {
-    addBuilder(
-        "dynamic", new DynamicTypeBuilder(const DynamicType(), this, -1), -1);
+    addBuilder("dynamic",
+        new DynamicTypeDeclarationBuilder(const DynamicType(), this, -1), -1);
   }
 
   void addSyntheticDeclarationOfNever() {
     addBuilder(
         "Never",
-        new NeverTypeBuilder(
+        new NeverTypeDeclarationBuilder(
             const NeverType(Nullability.nonNullable), this, -1),
         -1);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index bf1173b..8558d1f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -67,7 +67,7 @@
 import '../builder/type_variable_builder.dart';
 import '../builder/unresolved_type.dart';
 import '../builder/variable_builder.dart';
-import '../builder/void_type_builder.dart';
+import '../builder/void_type_declaration_builder.dart';
 
 import '../constant_context.dart' show ConstantContext;
 
@@ -3248,8 +3248,12 @@
       // TODO(ahe): Arguments could be passed here.
       libraryBuilder.addProblem(
           name.message, name.charOffset, name.name.length, name.fileUri);
-      result = new NamedTypeBuilder(name.name,
-          libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable), null)
+      result = new NamedTypeBuilder(
+          name.name,
+          libraryBuilder.nullableBuilderIfTrue(isMarkedAsNullable),
+          /* arguments = */ null,
+          name.fileUri,
+          name.charOffset)
         ..bind(new InvalidTypeDeclarationBuilder(
             name.name,
             name.message.withLocation(
@@ -3318,7 +3322,8 @@
     push(new UnresolvedType(
         new NamedTypeBuilder(
             "void", const NullabilityBuilder.nullable(), null, uri, offset)
-          ..bind(new VoidTypeBuilder(const VoidType(), libraryBuilder, offset)),
+          ..bind(new VoidTypeDeclarationBuilder(
+              const VoidType(), libraryBuilder, offset)),
         offset,
         uri));
   }
@@ -6036,7 +6041,11 @@
       if (message == null) return unresolved;
       return new UnresolvedType(
           new NamedTypeBuilder(
-              typeParameter.name, builder.nullabilityBuilder, null)
+              typeParameter.name,
+              builder.nullabilityBuilder,
+              /* arguments = */ null,
+              unresolved.fileUri,
+              unresolved.charOffset)
             ..bind(
                 new InvalidTypeDeclarationBuilder(typeParameter.name, message)),
           unresolved.charOffset,
@@ -6508,7 +6517,7 @@
       [List<TypeVariableBuilder> typeParameters]) {
     return new UnresolvedType(
         new FunctionTypeBuilder(returnType?.builder, typeParameters, parameters,
-            nullabilityBuilder),
+            nullabilityBuilder, uri, charOffset),
         charOffset,
         uri);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index b392aab..ec809d6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -272,8 +272,13 @@
   /// create a [TypeBuilder] for a valid type.
   TypeBuilder buildTypeWithResolvedArguments(
       NullabilityBuilder nullabilityBuilder, List<UnresolvedType> arguments) {
-    NamedTypeBuilder result =
-        new NamedTypeBuilder(token.lexeme, nullabilityBuilder, null);
+    // TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
+    NamedTypeBuilder result = new NamedTypeBuilder(
+        token.lexeme,
+        nullabilityBuilder,
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     Message message = templateNotAType.withArguments(token.lexeme);
     _helper.libraryBuilder
         .addProblem(message, fileOffset, lengthForToken(token), _uri);
@@ -2858,8 +2863,13 @@
           .withLocation(
               _uri, charOffset, lengthOfSpan(prefixGenerator.token, token));
     }
-    NamedTypeBuilder result =
-        new NamedTypeBuilder(name, nullabilityBuilder, null);
+    // TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
+    NamedTypeBuilder result = new NamedTypeBuilder(
+        name,
+        nullabilityBuilder,
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     _helper.libraryBuilder.addProblem(
         message.messageObject, message.charOffset, message.length, message.uri);
     result.bind(result.buildInvalidTypeDeclarationBuilder(message));
@@ -3896,8 +3906,13 @@
     Template<Message Function(String, String)> template = isUnresolved
         ? templateUnresolvedPrefixInTypeAnnotation
         : templateNotAPrefixInTypeAnnotation;
-    NamedTypeBuilder result =
-        new NamedTypeBuilder(_plainNameForRead, nullabilityBuilder, null);
+    // TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
+    NamedTypeBuilder result = new NamedTypeBuilder(
+        _plainNameForRead,
+        nullabilityBuilder,
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     Message message =
         template.withArguments(prefixGenerator.token.lexeme, token.lexeme);
     _helper.libraryBuilder.addProblem(
@@ -3998,8 +4013,13 @@
 
   TypeBuilder buildTypeWithResolvedArguments(
       NullabilityBuilder nullabilityBuilder, List<UnresolvedType> arguments) {
-    NamedTypeBuilder result =
-        new NamedTypeBuilder(token.lexeme, nullabilityBuilder, null);
+    // TODO(johnniwinther): Could we use a FixedTypeBuilder(InvalidType()) here?
+    NamedTypeBuilder result = new NamedTypeBuilder(
+        token.lexeme,
+        nullabilityBuilder,
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null);
     _helper.libraryBuilder.addProblem(message, fileOffset, noLength, _uri);
     result.bind(result.buildInvalidTypeDeclarationBuilder(
         message.withLocation(_uri, fileOffset, noLength)));
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 3a5f05f..a7d6a2a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -65,19 +65,19 @@
 import '../builder/builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
-import '../builder/dynamic_type_builder.dart';
+import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/field_builder.dart';
 import '../builder/invalid_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
-import '../builder/never_type_builder.dart';
+import '../builder/never_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/procedure_builder.dart';
 import '../builder/type_alias_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_declaration_builder.dart';
 import '../builder/type_variable_builder.dart';
-import '../builder/void_type_builder.dart';
+import '../builder/void_type_declaration_builder.dart';
 
 import '../compiler_context.dart' show CompilerContext;
 
@@ -148,18 +148,38 @@
   Component component;
 
   // 'dynamic' is always nullable.
+  // TODO(johnniwinther): Why isn't this using a FixedTypeBuilder?
   final TypeBuilder dynamicType = new NamedTypeBuilder(
-      "dynamic", const NullabilityBuilder.nullable(), null);
+      "dynamic",
+      const NullabilityBuilder.nullable(),
+      /* arguments = */ null,
+      /* fileUri = */ null,
+      /* charOffset = */ null);
 
-  final NamedTypeBuilder objectType =
-      new NamedTypeBuilder("Object", const NullabilityBuilder.omitted(), null);
+  final NamedTypeBuilder objectType = new NamedTypeBuilder(
+      "Object",
+      const NullabilityBuilder.omitted(),
+      /* arguments = */ null,
+      /* fileUri = */ null,
+      /* charOffset = */ null);
 
   // Null is always nullable.
-  final TypeBuilder nullType =
-      new NamedTypeBuilder("Null", const NullabilityBuilder.nullable(), null);
+  // TODO(johnniwinther): This could (maybe) use a FixedTypeBuilder when we
+  //  have NullType?
+  final TypeBuilder nullType = new NamedTypeBuilder(
+      "Null",
+      const NullabilityBuilder.nullable(),
+      /* arguments = */ null,
+      /* fileUri = */ null,
+      /* charOffset = */ null);
 
-  final TypeBuilder bottomType =
-      new NamedTypeBuilder("Never", const NullabilityBuilder.omitted(), null);
+  // TODO(johnniwinther): Why isn't this using a FixedTypeBuilder?
+  final TypeBuilder bottomType = new NamedTypeBuilder(
+      "Never",
+      const NullabilityBuilder.omitted(),
+      /* arguments = */ null,
+      /* fileUri = */ null,
+      /* charOffset = */ null);
 
   final bool excludeSource = !CompilerContext.current.options.embedSourceText;
 
@@ -289,9 +309,13 @@
     cls.implementedTypes.clear();
     cls.supertype = null;
     cls.mixedInType = null;
-    builder.supertypeBuilder =
-        new NamedTypeBuilder("Object", const NullabilityBuilder.omitted(), null)
-          ..bind(objectClassBuilder);
+    builder.supertypeBuilder = new NamedTypeBuilder(
+        "Object",
+        const NullabilityBuilder.omitted(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(objectClassBuilder);
     builder.interfaceBuilders = null;
     builder.mixedInTypeBuilder = null;
   }
@@ -456,7 +480,11 @@
             if (cls != objectClass) {
               cls.supertype ??= objectClass.asRawSupertype;
               declaration.supertypeBuilder ??= new NamedTypeBuilder(
-                  "Object", const NullabilityBuilder.omitted(), null)
+                  "Object",
+                  const NullabilityBuilder.omitted(),
+                  /* arguments = */ null,
+                  /* fileUri = */ null,
+                  /* charOffset = */ null)
                 ..bind(objectClassBuilder);
             }
             if (declaration.isMixinApplication) {
@@ -593,9 +621,9 @@
       }
     } else if (supertype is InvalidTypeDeclarationBuilder ||
         supertype is TypeVariableBuilder ||
-        supertype is DynamicTypeBuilder ||
-        supertype is VoidTypeBuilder ||
-        supertype is NeverTypeBuilder) {
+        supertype is DynamicTypeDeclarationBuilder ||
+        supertype is VoidTypeDeclarationBuilder ||
+        supertype is NeverTypeDeclarationBuilder) {
       builder.addSyntheticConstructor(
           makeDefaultConstructor(builder.cls, referenceFrom));
     } else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 3716204..9143dcb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -279,8 +279,8 @@
       assert(false, "Unexpected named type builder declaration: $declaration.");
     }
     if (arguments != null) {
-      NamedTypeBuilder newTypeBuilder =
-          new NamedTypeBuilder(type.name, type.nullabilityBuilder, arguments);
+      NamedTypeBuilder newTypeBuilder = new NamedTypeBuilder(type.name,
+          type.nullabilityBuilder, arguments, type.fileUri, type.charOffset);
       if (declaration != null) {
         newTypeBuilder.bind(declaration);
       } else {
@@ -365,8 +365,8 @@
     changed = changed || returnType != type.returnType;
 
     if (changed) {
-      return new FunctionTypeBuilder(
-          returnType, variables, formals, type.nullabilityBuilder);
+      return new FunctionTypeBuilder(returnType, variables, formals,
+          type.nullabilityBuilder, type.fileUri, type.charOffset);
     }
     return type;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 239e403..0aea072 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -29,17 +29,17 @@
         VoidType;
 
 import '../builder/class_builder.dart';
-import '../builder/dynamic_type_builder.dart';
+import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/formal_parameter_builder.dart';
 import '../builder/function_type_builder.dart';
-import '../builder/future_or_type_builder.dart';
+import '../builder/future_or_type_declaration_builder.dart';
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
-import '../builder/never_type_builder.dart';
+import '../builder/never_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
-import '../builder/void_type_builder.dart';
+import '../builder/void_type_declaration_builder.dart';
 
 import '../loader.dart' show Loader;
 
@@ -62,17 +62,26 @@
   TypeBuilder visitDynamicType(DynamicType node) {
     // 'dynamic' is always nullable.
     return new NamedTypeBuilder(
-        "dynamic", const NullabilityBuilder.nullable(), null)
-      ..bind(
-          new DynamicTypeBuilder(const DynamicType(), loader.coreLibrary, -1));
+        "dynamic",
+        const NullabilityBuilder.nullable(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(new DynamicTypeDeclarationBuilder(
+          const DynamicType(), loader.coreLibrary, -1));
   }
 
   @override
   TypeBuilder visitVoidType(VoidType node) {
     // 'void' is always nullable.
     return new NamedTypeBuilder(
-        "void", const NullabilityBuilder.nullable(), null)
-      ..bind(new VoidTypeBuilder(const VoidType(), loader.coreLibrary, -1));
+        "void",
+        const NullabilityBuilder.nullable(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(new VoidTypeDeclarationBuilder(
+          const VoidType(), loader.coreLibrary, -1));
   }
 
   @override
@@ -83,8 +92,12 @@
   @override
   TypeBuilder visitNeverType(NeverType node) {
     return new NamedTypeBuilder(
-        "Never", new NullabilityBuilder.fromNullability(node.nullability), null)
-      ..bind(new NeverTypeBuilder(node, loader.coreLibrary, -1));
+        "Never",
+        new NullabilityBuilder.fromNullability(node.nullability),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(new NeverTypeDeclarationBuilder(node, loader.coreLibrary, -1));
   }
 
   @override
@@ -99,17 +112,25 @@
         arguments[i] = kernelArguments[i].accept(this);
       }
     }
-    return new NamedTypeBuilder(cls.name,
-        new NullabilityBuilder.fromNullability(node.nullability), arguments)
+    return new NamedTypeBuilder(
+        cls.name,
+        new NullabilityBuilder.fromNullability(node.nullability),
+        arguments,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
       ..bind(cls);
   }
 
   @override
   TypeBuilder visitFutureOrType(FutureOrType node) {
     TypeBuilder argument = node.typeArgument.accept(this);
-    return new NamedTypeBuilder("FutureOr",
-        new NullabilityBuilder.fromNullability(node.nullability), [argument])
-      ..bind(new FutureOrTypeBuilder(node, loader.coreLibrary, -1));
+    return new NamedTypeBuilder(
+        "FutureOr",
+        new NullabilityBuilder.fromNullability(node.nullability),
+        [argument],
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(new FutureOrTypeDeclarationBuilder(node, loader.coreLibrary, -1));
   }
 
   @override
@@ -139,8 +160,13 @@
           null, 0, type, parameter.name, null, -1, null)
         ..kind = FormalParameterKind.optionalNamed;
     }
-    return new FunctionTypeBuilder(returnType, typeVariables, formals,
-        new NullabilityBuilder.fromNullability(node.nullability));
+    return new FunctionTypeBuilder(
+        returnType,
+        typeVariables,
+        formals,
+        new NullabilityBuilder.fromNullability(node.nullability),
+        /* fileUri = */ null,
+        /* charOffset = */ null);
   }
 
   TypeBuilder visitTypeParameterType(TypeParameterType node) {
@@ -153,8 +179,12 @@
       kernelLibrary = kernelClassOrTypeDef.enclosingLibrary;
     }
     LibraryBuilder library = loader.builders[kernelLibrary.importUri];
-    return new NamedTypeBuilder(parameter.name,
-        new NullabilityBuilder.fromNullability(node.nullability), null)
+    return new NamedTypeBuilder(
+        parameter.name,
+        new NullabilityBuilder.fromNullability(node.nullability),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
       ..bind(new TypeVariableBuilder.fromKernel(parameter, library));
   }
 
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 5731350..f8b81ce 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -673,7 +673,10 @@
         supertype = supertypeConstraints.first;
       } else {
         supertype = new MixinApplicationBuilder(
-            supertypeConstraints.first, supertypeConstraints.skip(1).toList());
+            supertypeConstraints.first,
+            supertypeConstraints.skip(1).toList(),
+            supertypeConstraints.first.fileUri,
+            supertypeConstraints.first.charOffset);
       }
     }
 
@@ -761,7 +764,9 @@
     String documentationComment = getDocumentationComment(extensionKeyword);
     Object onType = pop();
     if (onType is ParserRecovery) {
-      onType = new FixedTypeBuilder(const InvalidType());
+      ParserRecovery parserRecovery = onType;
+      onType = new FixedTypeBuilder(
+          const InvalidType(), uri, parserRecovery.charOffset);
     }
     List<TypeVariableBuilder> typeVariables = pop(NullValue.TypeVariables);
     int nameOffset = pop();
@@ -822,6 +827,11 @@
         // [BodyBuilder.finishFunction].
         isAbstract = false;
       }
+      if (returnType != null && !returnType.isVoidType) {
+        addProblem(messageNonVoidReturnSetter, beginToken.charOffset, noLength);
+        // Use implicit void as recovery.
+        returnType = null;
+      }
     }
     int modifiers = pop();
     modifiers = Modifier.addAbstractMask(modifiers, isAbstract: isAbstract);
@@ -1067,6 +1077,20 @@
         // [BodyBuilder.finishFunction].
         isAbstract = false;
       }
+      if (returnType != null && !returnType.isVoidType) {
+        addProblem(messageNonVoidReturnSetter,
+            returnType.charOffset ?? beginToken.charOffset, noLength);
+        // Use implicit void as recovery.
+        returnType = null;
+      }
+    }
+    if (nameOrOperator == Operator.indexSet &&
+        returnType != null &&
+        !returnType.isVoidType) {
+      addProblem(messageNonVoidReturnOperator,
+          returnType.charOffset ?? beginToken.offset, noLength);
+      // Use implicit void as recovery.
+      returnType = null;
     }
     int modifiers = Modifier.toMask(pop());
     modifiers = Modifier.addAbstractMask(modifiers, isAbstract: isAbstract);
@@ -1148,9 +1172,8 @@
         modifiers &= ~constMask;
       }
       if (returnType != null) {
-        // TODO(danrubel): Report this error on the return type
-        handleRecoverableError(
-            messageConstructorWithReturnType, beginToken, beginToken);
+        addProblem(messageConstructorWithReturnType,
+            returnType.charOffset ?? beginToken.offset, noLength);
         returnType = null;
       }
       final int startCharOffset =
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 7418ddc..53b4d1b 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -308,7 +308,11 @@
     }
     if (message != null) {
       return new NamedTypeBuilder(
-          supertype.name, const NullabilityBuilder.omitted(), null)
+          supertype.name,
+          const NullabilityBuilder.omitted(),
+          /* arguments = */ null,
+          fileUri,
+          charOffset)
         ..bind(new InvalidTypeDeclarationBuilder(supertype.name,
             message.withLocation(fileUri, charOffset, noLength)));
     }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index e471194..08bf137 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -76,11 +76,11 @@
 import '../../base/nnbd_mode.dart';
 
 import '../builder/builder.dart';
-import '../builder/builtin_type_builder.dart';
+import '../builder/builtin_type_declaration_builder.dart';
 import '../builder/class_builder.dart';
 import '../builder/constructor_builder.dart';
 import '../builder/constructor_reference_builder.dart';
-import '../builder/dynamic_type_builder.dart';
+import '../builder/dynamic_type_declaration_builder.dart';
 import '../builder/enum_builder.dart';
 import '../builder/extension_builder.dart';
 import '../builder/field_builder.dart';
@@ -94,7 +94,7 @@
 import '../builder/mixin_application_builder.dart';
 import '../builder/name_iterator.dart';
 import '../builder/named_type_builder.dart';
-import '../builder/never_type_builder.dart';
+import '../builder/never_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/prefix_builder.dart';
 import '../builder/procedure_builder.dart';
@@ -103,7 +103,7 @@
 import '../builder/type_declaration_builder.dart';
 import '../builder/type_variable_builder.dart';
 import '../builder/unresolved_type.dart';
-import '../builder/void_type_builder.dart';
+import '../builder/void_type_declaration_builder.dart';
 
 import '../combinator.dart' show Combinator;
 
@@ -1324,14 +1324,14 @@
   Uri get importUri => library.importUri;
 
   void addSyntheticDeclarationOfDynamic() {
-    addBuilder(
-        "dynamic", new DynamicTypeBuilder(const DynamicType(), this, -1), -1);
+    addBuilder("dynamic",
+        new DynamicTypeDeclarationBuilder(const DynamicType(), this, -1), -1);
   }
 
   void addSyntheticDeclarationOfNever() {
     addBuilder(
         "Never",
-        new NeverTypeBuilder(
+        new NeverTypeDeclarationBuilder(
             const NeverType(Nullability.nonNullable), this, -1),
         -1);
   }
@@ -1346,14 +1346,17 @@
 
   TypeBuilder addMixinApplication(
       TypeBuilder supertype, List<TypeBuilder> mixins, int charOffset) {
-    return addType(new MixinApplicationBuilder(supertype, mixins), charOffset);
+    return addType(
+        new MixinApplicationBuilder(supertype, mixins, fileUri, charOffset),
+        charOffset);
   }
 
   TypeBuilder addVoidType(int charOffset) {
     // 'void' is always nullable.
     return addNamedType(
         "void", const NullabilityBuilder.nullable(), null, charOffset)
-      ..bind(new VoidTypeBuilder(const VoidType(), this, charOffset));
+      ..bind(
+          new VoidTypeDeclarationBuilder(const VoidType(), this, charOffset));
   }
 
   /// Add a problem that might not be reported immediately.
@@ -2404,8 +2407,8 @@
       List<FormalParameterBuilder> formals,
       NullabilityBuilder nullabilityBuilder,
       int charOffset) {
-    FunctionTypeBuilder builder = new FunctionTypeBuilder(
-        returnType, typeVariables, formals, nullabilityBuilder);
+    FunctionTypeBuilder builder = new FunctionTypeBuilder(returnType,
+        typeVariables, formals, nullabilityBuilder, fileUri, charOffset);
     checkTypeVariables(typeVariables, null);
     // Nested declaration began in `OutlineBuilder.beginFunctionType` or
     // `OutlineBuilder.beginFunctionTypedFormalParameter`.
@@ -2497,7 +2500,7 @@
     } else if (declaration is PrefixBuilder) {
       // Ignored. Kernel doesn't represent prefixes.
       return;
-    } else if (declaration is BuiltinTypeBuilder) {
+    } else if (declaration is BuiltinTypeDeclarationBuilder) {
       // Nothing needed.
       return;
     } else {
@@ -2929,8 +2932,8 @@
         assert(
             declaration is FieldBuilder ||
                 declaration is PrefixBuilder ||
-                declaration is DynamicTypeBuilder ||
-                declaration is NeverTypeBuilder,
+                declaration is DynamicTypeDeclarationBuilder ||
+                declaration is NeverTypeDeclarationBuilder,
             "Unexpected top level member $declaration "
             "(${declaration.runtimeType}).");
       }
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
index b7d80dc..c16e23d 100644
--- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -15,10 +15,10 @@
 import 'package:kernel/ast.dart' as type;
 
 import '../builder/builder.dart' as type;
-import '../builder/builtin_type_builder.dart' as type;
+import '../builder/builtin_type_declaration_builder.dart' as type;
 import '../builder/class_builder.dart' as type;
 import '../builder/constructor_reference_builder.dart' as type;
-import '../builder/dynamic_type_builder.dart' as type;
+import '../builder/dynamic_type_declaration_builder.dart' as type;
 import '../builder/enum_builder.dart' as type;
 import '../builder/field_builder.dart' as type;
 import '../builder/formal_parameter_builder.dart' as type;
@@ -39,7 +39,7 @@
 import '../builder/type_declaration_builder.dart' as type;
 import '../builder/type_variable_builder.dart' as type;
 import '../builder/unresolved_type.dart' as type;
-import '../builder/void_type_builder.dart' as type;
+import '../builder/void_type_declaration_builder.dart' as type;
 
 import '../identifiers.dart' as type;
 
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 04dd919..b3ccbbe 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -4240,3 +4240,19 @@
     main() {
       Object = String;
     }
+
+NonVoidReturnOperator:
+  template: "The return type of the operator []= must be 'void'."
+  tip: "Try changing the return type to 'void'."
+  analyzerCode: NON_VOID_RETURN_FOR_OPERATOR
+  script:
+    - class Class { int operator[]=(a, b) {} }
+    - class Class { dynamic operator[]=(a, b) {} }
+
+NonVoidReturnSetter:
+  template: "The return type of the setter must be 'void' or absent."
+  tip: "Try removing the return type, or define a method rather than a setter."
+  analyzerCode: NON_VOID_RETURN_FOR_SETTER
+  script:
+    - int set setter(_) {}
+    - dynamic set setter(_) {}
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart b/pkg/front_end/testcases/general/invalid_setter_return_type.dart
new file mode 100644
index 0000000..7bf0d86
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+int set setter1(_) {} // error
+dynamic set setter2(_) {} // error
+void set setter3(_) {} // ok
+set setter4(_) {} // ok
+
+class Class1 {
+  int set setter1(_) {} // error
+  int operator []=(a, b) {} // error
+}
+
+class Class2 {
+  dynamic set setter2(_) {} // error
+  dynamic operator []=(a, b) {} // error
+}
+
+class Class3 {
+  void set setter3(_) {} // ok
+  void operator []=(a, b) {} // ok
+}
+
+class Class4 {
+  set setter4(_) {} // ok
+  operator []=(a, b) {} // ok
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart.outline.expect b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.outline.expect
new file mode 100644
index 0000000..fa52301
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.outline.expect
@@ -0,0 +1,119 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:5:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// int set setter1(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:6:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// dynamic set setter2(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:11:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   int set setter1(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:12:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   int operator []=(a, b) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:16:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   dynamic set setter2(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:17:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   dynamic operator []=(a, b) {} // error
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1*
+    ;
+  set setter1(dynamic _) → void
+    ;
+  operator []=(dynamic a, dynamic b) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2*
+    ;
+  set setter2(dynamic _) → void
+    ;
+  operator []=(dynamic a, dynamic b) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3*
+    ;
+  set setter3(dynamic _) → void
+    ;
+  operator []=(dynamic a, dynamic b) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4 extends core::Object {
+  synthetic constructor •() → self::Class4*
+    ;
+  set setter4(dynamic _) → void
+    ;
+  operator []=(dynamic a, dynamic b) → void
+    ;
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set setter1(dynamic _) → void
+  ;
+static set setter2(dynamic _) → void
+  ;
+static set setter3(dynamic _) → void
+  ;
+static set setter4(dynamic _) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart.strong.expect b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.strong.expect
new file mode 100644
index 0000000..096efed
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.strong.expect
@@ -0,0 +1,110 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:5:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// int set setter1(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:6:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// dynamic set setter2(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:11:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   int set setter1(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:12:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   int operator []=(a, b) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:16:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   dynamic set setter2(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:17:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   dynamic operator []=(a, b) {} // error
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1*
+    : super core::Object::•()
+    ;
+  set setter1(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2*
+    : super core::Object::•()
+    ;
+  set setter2(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3*
+    : super core::Object::•()
+    ;
+  set setter3(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4 extends core::Object {
+  synthetic constructor •() → self::Class4*
+    : super core::Object::•()
+    ;
+  set setter4(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set setter1(dynamic _) → void {}
+static set setter2(dynamic _) → void {}
+static set setter3(dynamic _) → void {}
+static set setter4(dynamic _) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..096efed
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.strong.transformed.expect
@@ -0,0 +1,110 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:5:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// int set setter1(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:6:1: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+// dynamic set setter2(_) {} // error
+// ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:11:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   int set setter1(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:12:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   int operator []=(a, b) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:16:3: Error: The return type of the setter must be 'void' or absent.
+// Try removing the return type, or define a method rather than a setter.
+//   dynamic set setter2(_) {} // error
+//   ^
+//
+// pkg/front_end/testcases/general/invalid_setter_return_type.dart:17:3: Error: The return type of the operator []= must be 'void'.
+// Try changing the return type to 'void'.
+//   dynamic operator []=(a, b) {} // error
+//   ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Class1 extends core::Object {
+  synthetic constructor •() → self::Class1*
+    : super core::Object::•()
+    ;
+  set setter1(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class2 extends core::Object {
+  synthetic constructor •() → self::Class2*
+    : super core::Object::•()
+    ;
+  set setter2(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class3 extends core::Object {
+  synthetic constructor •() → self::Class3*
+    : super core::Object::•()
+    ;
+  set setter3(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+class Class4 extends core::Object {
+  synthetic constructor •() → self::Class4*
+    : super core::Object::•()
+    ;
+  set setter4(dynamic _) → void {}
+  operator []=(dynamic a, dynamic b) → void {}
+  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
+  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
+  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
+  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
+  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
+  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
+  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
+  abstract member-signature method toString() → core::String*; -> core::Object::toString
+  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
+  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
+}
+static set setter1(dynamic _) → void {}
+static set setter2(dynamic _) → void {}
+static set setter3(dynamic _) → void {}
+static set setter4(dynamic _) → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart.textual_outline.expect b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.textual_outline.expect
new file mode 100644
index 0000000..5009b26
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.textual_outline.expect
@@ -0,0 +1,26 @@
+int set setter1(_) {}
+dynamic set setter2(_) {}
+void set setter3(_) {}
+set setter4(_) {}
+
+class Class1 {
+  int set setter1(_) {}
+  int operator []=(a, b) {}
+}
+
+class Class2 {
+  dynamic set setter2(_) {}
+  dynamic operator []=(a, b) {}
+}
+
+class Class3 {
+  void set setter3(_) {}
+  void operator []=(a, b) {}
+}
+
+class Class4 {
+  set setter4(_) {}
+  operator []=(a, b) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/invalid_setter_return_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..721e925
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_setter_return_type.dart.textual_outline_modelled.expect
@@ -0,0 +1,25 @@
+class Class1 {
+  int operator []=(a, b) {}
+  int set setter1(_) {}
+}
+
+class Class2 {
+  dynamic operator []=(a, b) {}
+  dynamic set setter2(_) {}
+}
+
+class Class3 {
+  void operator []=(a, b) {}
+  void set setter3(_) {}
+}
+
+class Class4 {
+  operator []=(a, b) {}
+  set setter4(_) {}
+}
+
+dynamic set setter2(_) {}
+int set setter1(_) {}
+main() {}
+set setter4(_) {}
+void set setter3(_) {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart
index 47099c8..76224c4 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  dynamic operator []=(dynamic index, dynamic value) {}
+  operator []=(dynamic index, dynamic value) {}
 }
 
 abstract class I {
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
index 0a778ace..cd6595c 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   synthetic constructor •() → self::C*
     ;
-  operator []=(dynamic index, dynamic value) → dynamic
+  operator []=(dynamic index, dynamic value) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
index 08a009b..d7facc2 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(dynamic index, dynamic value) → dynamic {}
+  operator []=(dynamic index, dynamic value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect
index 08a009b..d7facc2 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(dynamic index, dynamic value) → dynamic {}
+  operator []=(dynamic index, dynamic value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline.expect
index 71f35b9..2eac7bf 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline.expect
@@ -1,7 +1,7 @@
 library test;
 
 class C {
-  dynamic operator []=(dynamic index, dynamic value) {}
+  operator []=(dynamic index, dynamic value) {}
 }
 
 abstract class I {
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline_modelled.expect
index d950bce..04312eb 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.textual_outline_modelled.expect
@@ -5,7 +5,7 @@
 }
 
 class C {
-  dynamic operator []=(dynamic index, dynamic value) {}
+  operator []=(dynamic index, dynamic value) {}
 }
 
 class D extends C implements I {
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart
index 84362ad..8ca0f2e 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  dynamic operator []=(int index, dynamic value) {}
+  operator []=(int index, dynamic value) {}
 }
 
 abstract class I {
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect
index 4d3da34..13c3679 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   synthetic constructor •() → self::C*
     ;
-  operator []=(core::int* index, dynamic value) → dynamic
+  operator []=(core::int* index, dynamic value) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect
index 697545a..9cecf38 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(core::int* index, dynamic value) → dynamic {}
+  operator []=(core::int* index, dynamic value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect
index 697545a..9cecf38 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(core::int* index, dynamic value) → dynamic {}
+  operator []=(core::int* index, dynamic value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline.expect
index 5b865ba..65369b6 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline.expect
@@ -1,7 +1,7 @@
 library test;
 
 class C {
-  dynamic operator []=(int index, dynamic value) {}
+  operator []=(int index, dynamic value) {}
 }
 
 abstract class I {
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline_modelled.expect
index 700f73a..7202539 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.textual_outline_modelled.expect
@@ -5,7 +5,7 @@
 }
 
 class C {
-  dynamic operator []=(int index, dynamic value) {}
+  operator []=(int index, dynamic value) {}
 }
 
 class D extends C implements I {
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart b/pkg/front_end/testcases/inference/setter_return_type.dart
index 7ea8bea..62c1657 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  dynamic set x(int value) {}
+  set x(int value) {}
 }
 
 abstract class I {
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect
index 9c92f49..a846937 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   synthetic constructor •() → self::C*
     ;
-  set x(core::int* value) → dynamic
+  set x(core::int* value) → void
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect
index 43b7fff..b816e0d 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::int* value) → dynamic {}
+  set x(core::int* value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect
index 43b7fff..b816e0d 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::int* value) → dynamic {}
+  set x(core::int* value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline.expect
index f9485e8..9143a0a 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline.expect
@@ -1,7 +1,7 @@
 library test;
 
 class C {
-  dynamic set x(int value) {}
+  set x(int value) {}
 }
 
 abstract class I {
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline_modelled.expect
index 001950d..3f4534d 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.textual_outline_modelled.expect
@@ -5,7 +5,7 @@
 }
 
 class C {
-  dynamic set x(int value) {}
+  set x(int value) {}
 }
 
 class D extends C implements I {
diff --git a/runtime/vm/datastream.h b/runtime/vm/datastream.h
index 6e0547b..a844493 100644
--- a/runtime/vm/datastream.h
+++ b/runtime/vm/datastream.h
@@ -15,13 +15,13 @@
 
 namespace dart {
 
-// (S)LEB128 encodes 7 bits of data per byte (hence 128).
-static constexpr uint8_t kDataBitsPerByte = 7;
-static constexpr uint8_t kDataByteMask = (1 << kDataBitsPerByte) - 1;
-// If more data follows a given data byte, the high bit is set.
-static constexpr uint8_t kMoreDataMask = (1 << kDataBitsPerByte);
-// For SLEB128, the high bit in the data of the last byte is the sign bit.
-static constexpr uint8_t kSignMask = (1 << (kDataBitsPerByte - 1));
+static const int8_t kDataBitsPerByte = 7;
+static const int8_t kByteMask = (1 << kDataBitsPerByte) - 1;
+static const int8_t kMaxUnsignedDataPerByte = kByteMask;
+static const int8_t kMinDataPerByte = -(1 << (kDataBitsPerByte - 1));
+static const int8_t kMaxDataPerByte = (~kMinDataPerByte & kByteMask);  // NOLINT
+static const uint8_t kEndByteMarker = (255 - kMaxDataPerByte);
+static const uint8_t kEndUnsignedByteMarker = (255 - kMaxUnsignedDataPerByte);
 
 typedef uint8_t* (*ReAlloc)(uint8_t* ptr, intptr_t old_size, intptr_t new_size);
 typedef void (*DeAlloc)(uint8_t* ptr);
@@ -50,19 +50,19 @@
   template <typename T>
   class Raw<2, T> {
    public:
-    static T Read(ReadStream* st) { return bit_cast<T>(st->Read16<int16_t>()); }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->Read16()); }
   };
 
   template <typename T>
   class Raw<4, T> {
    public:
-    static T Read(ReadStream* st) { return bit_cast<T>(st->Read32<int32_t>()); }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->Read32()); }
   };
 
   template <typename T>
   class Raw<8, T> {
    public:
-    static T Read(ReadStream* st) { return bit_cast<T>(st->Read64<int64_t>()); }
+    static T Read(ReadStream* st) { return bit_cast<T>(st->Read64()); }
   };
 
   // Reads 'len' bytes from the stream.
@@ -74,15 +74,9 @@
     current_ += len;
   }
 
-  // Reads a value of type [T] assuming an encoding of LEB128 (whether or not
-  // the type itself is unsigned).
   template <typename T = intptr_t>
   T ReadUnsigned() {
-    if (std::is_unsigned<T>::value) {
-      return ReadInternal<T>();
-    } else {
-      return bit_cast<T>(ReadUnsigned<typename std::make_unsigned<T>::type>());
-    }
+    return Read<T>(kEndUnsignedByteMarker);
   }
 
   intptr_t Position() const { return current_ - buffer_; }
@@ -109,15 +103,9 @@
     return (end_ - current_);
   }
 
-  // Reads a value of type [T] assuming an encoding of SLEB128 (whether or not
-  // the type itself is signed).
   template <typename T>
   T Read() {
-    if (std::is_signed<T>::value) {
-      return ReadInternal<T>();
-    } else {
-      return bit_cast<T>(Read<typename std::make_signed<T>::type>());
-    }
+    return Read<T>(kEndByteMarker);
   }
 
   uword ReadWordWith32BitReads() {
@@ -134,112 +122,179 @@
   }
 
  private:
+  uint16_t Read16() { return Read16(kEndByteMarker); }
+
+  uint32_t Read32() { return Read32(kEndByteMarker); }
+
+  uint64_t Read64() { return Read64(kEndByteMarker); }
+
   template <typename T>
-  T ReadInternal() {
+  T Read(uint8_t end_byte_marker) {
     using Unsigned = typename std::make_unsigned<T>::type;
     const uint8_t* c = current_;
-    Unsigned r = 0;
+    ASSERT(c < end_);
+    Unsigned b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return b - end_byte_marker;
+    }
+    T r = 0;
     uint8_t s = 0;
-    uint8_t b;
     do {
+      r |= static_cast<Unsigned>(b) << s;
+      s += kDataBitsPerByte;
       ASSERT(c < end_);
       b = *c++;
-      r |= static_cast<Unsigned>(b & kDataByteMask) << s;
-      s += kDataBitsPerByte;
-    } while ((b & kMoreDataMask) != 0);
+    } while (b <= kMaxUnsignedDataPerByte);
     current_ = c;
-    // At this point, [s] contains how many data bits have made it into the
-    // value. If the type is signed, the value negative, and the count of data
-    // bits is less than the size of the value, then we need to extend the sign
-    // by setting the remaining (unset) most significant bits (MSBs).
-    Unsigned sign_bits = 0;
-    const bool is_signed = std::is_signed<T>::value;
-    if (is_signed && (b & kSignMask) != 0 && s < (kBitsPerByte * sizeof(T))) {
-      // Create a bitmask for the current data bits and invert it.
-      sign_bits = ~((static_cast<Unsigned>(1) << s) - 1);
+    return r | (static_cast<Unsigned>(b - end_byte_marker) << s);
+  }
+
+  uint16_t Read16(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint16_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return b - end_byte_marker;
     }
-    return static_cast<T>(r | sign_bits);
+    uint16_t r = b;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint16_t>(b - end_byte_marker) << 7);
+    }
+
+    r |= b << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | (static_cast<uint16_t>(b - end_byte_marker) << 14);
   }
 
-// Setting up needed variables for the unrolled loop sections below.
-#define UNROLLED_INIT()                                                        \
-  using Unsigned = typename std::make_unsigned<T>::type;                       \
-  const uint8_t* c = current_;                                                 \
-  uint8_t b;                                                                   \
-  Unsigned r = 0;
+  uint32_t Read32(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint32_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return b - end_byte_marker;
+    }
 
-// Part of the unrolled loop where the loop may stop, having read the last part,
-// or continue reading. If stopping, extend the sign for signed values.
-#define UNROLLED_BODY(bit_start)                                               \
-  static_assert(bit_start % kDataBitsPerByte == 0,                             \
-                "Bit start must be a multiple of the data bits per byte");     \
-  static_assert(bit_start >= 0 && bit_start < kBitsPerByte * sizeof(T),        \
-                "Starting unrolled body at invalid bit position");             \
-  ASSERT(c < end_);                                                            \
-  b = *c++;                                                                    \
-  r |= static_cast<Unsigned>(b & kDataByteMask) << bit_start;                  \
-  if ((b & kMoreDataMask) == 0) {                                              \
-    current_ = c;                                                              \
-    Unsigned sign_bits = 0;                                                    \
-    if (std::is_signed<T>::value && (b & kSignMask) != 0) {                    \
-      sign_bits = ~((static_cast<Unsigned>(1) << (bit_start + 7)) - 1);        \
-    }                                                                          \
-    return static_cast<T>(r | sign_bits);                                      \
+    uint32_t r = b;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint32_t>(b - end_byte_marker) << 7);
+    }
+
+    r |= b << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint32_t>(b - end_byte_marker) << 14);
+    }
+
+    r |= b << 14;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint32_t>(b - end_byte_marker) << 21);
+    }
+
+    r |= b << 21;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | (static_cast<uint32_t>(b - end_byte_marker) << 28);
   }
 
-// If the unrolled end is reached, the last part always includes the original
-// sign bit, so no need to sign extend.
-#define UNROLLED_END(bit_start)                                                \
-  static_assert(bit_start % kDataBitsPerByte == 0,                             \
-                "Bit start must be a multiple of the data bits per byte");     \
-  static_assert(bit_start >= 0 && bit_start < kBitsPerByte * sizeof(T),        \
-                "Starting unrolled end at invalid bit position");              \
-  static_assert(bit_start + kDataBitsPerByte >= kBitsPerByte * sizeof(T),      \
-                "Unrolled end does not contain final bits in value");          \
-  ASSERT(c < end_);                                                            \
-  b = *c++;                                                                    \
-  r |= static_cast<Unsigned>(b & kDataByteMask) << bit_start;                  \
-  ASSERT_EQUAL((b & kMoreDataMask), 0);                                        \
-  current_ = c;                                                                \
-  return static_cast<T>(r);
+  uint64_t Read64(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint64_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return b - end_byte_marker;
+    }
+    uint64_t r = b;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 7);
+    }
 
-  template <typename T>
-  T Read16() {
-    UNROLLED_INIT();
-    UNROLLED_BODY(0);
-    UNROLLED_BODY(7);
-    UNROLLED_END(14);
+    r |= b << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 14);
+    }
+
+    r |= b << 14;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 21);
+    }
+
+    r |= b << 21;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 28);
+    }
+
+    r |= b << 28;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 35);
+    }
+
+    r |= b << 35;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 42);
+    }
+
+    r |= b << 42;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 49);
+    }
+
+    r |= b << 49;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | (static_cast<uint64_t>(b - end_byte_marker) << 56);
+    }
+
+    r |= b << 56;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | (static_cast<uint64_t>(b - end_byte_marker) << 63);
   }
 
-  template <typename T>
-  T Read32() {
-    UNROLLED_INIT();
-    UNROLLED_BODY(0);
-    UNROLLED_BODY(7);
-    UNROLLED_BODY(14);
-    UNROLLED_BODY(21);
-    UNROLLED_END(28);
-  }
-
-  template <typename T>
-  T Read64() {
-    UNROLLED_INIT();
-    UNROLLED_BODY(0);
-    UNROLLED_BODY(7);
-    UNROLLED_BODY(14);
-    UNROLLED_BODY(21);
-    UNROLLED_BODY(28);
-    UNROLLED_BODY(35);
-    UNROLLED_BODY(42);
-    UNROLLED_BODY(49);
-    UNROLLED_BODY(56);
-    UNROLLED_END(63);
-  }
-
-#undef UNROLLED_END
-#undef UNROLLED_BODY
-#undef UNROLLED_INIT
-
   uint8_t ReadByte() {
     ASSERT(current_ < end_);
     return *current_++;
@@ -295,7 +350,7 @@
   class Raw<1, T> {
    public:
     static void Write(WriteStream* st, T value) {
-      st->WriteByte(bit_cast<uint8_t>(value));
+      st->WriteByte(bit_cast<int8_t>(value));
     }
   };
 
@@ -335,17 +390,14 @@
     }
   }
 
-  // Writes the LEB128 encoding of [value] to the stream (whether or not the
-  // type [T] is unsigned).
   template <typename T>
   void WriteUnsigned(T value) {
     ASSERT(value >= 0);
-    if (std::is_unsigned<T>::value) {
-      WriteInternal<T>(value);
-    } else {
-      using Unsigned = typename std::make_unsigned<T>::type;
-      WriteUnsigned<Unsigned>(bit_cast<Unsigned>(value));
+    while (value > kMaxUnsignedDataPerByte) {
+      WriteByte(static_cast<uint8_t>(value & kByteMask));
+      value = value >> kDataBitsPerByte;
     }
+    WriteByte(static_cast<uint8_t>(value + kEndUnsignedByteMarker));
   }
 
   void WriteBytes(const void* addr, intptr_t len) {
@@ -413,16 +465,14 @@
     current_ += len;  // Not len + 1 to swallow the terminating NUL.
   }
 
-  // Writes the SLEB128 encoding of [value] to the stream (whether or not the
-  // type [T] is signed).
   template <typename T>
   void Write(T value) {
-    if (std::is_signed<T>::value) {
-      WriteInternal<T>(value);
-    } else {
-      using Signed = typename std::make_signed<T>::type;
-      Write<Signed>(bit_cast<Signed>(value));
+    T v = value;
+    while (v < kMinDataPerByte || v > kMaxDataPerByte) {
+      WriteByte(static_cast<uint8_t>(v & kByteMask));
+      v = v >> kDataBitsPerByte;
     }
+    WriteByte(static_cast<uint8_t>(v + kEndByteMarker));
   }
 
   template <typename T>
@@ -437,33 +487,6 @@
   }
 
  private:
-  template <typename T>
-  void WriteInternal(T value) {
-    T remainder = value;
-    bool is_last_part;
-    do {
-      uint8_t part = static_cast<uint8_t>(remainder & kDataByteMask);
-      remainder >>= kDataBitsPerByte;
-      // For unsigned types, we're done when the remainder has no bits set.
-      // For signed types, we're done when either:
-      // - the remainder has no bits set and the part's sign bit is unset, or
-      // - the remainder has all bits set and the part's sign bit is set.
-      // If the remainder matches but the sign bit does not, we need one more
-      // part to set the sign bit correctly.
-      is_last_part =
-          std::is_unsigned<T>::value
-              ? remainder == static_cast<T>(0)
-              : (remainder == static_cast<T>(0) && (part & kSignMask) == 0) ||
-                    (remainder == ~static_cast<T>(0) &&
-                     (part & kSignMask) != 0);
-      if (!is_last_part) {
-        // Mark this part as having more parts following it.
-        part |= kMoreDataMask;
-      }
-      WriteByte(part);
-    } while (!is_last_part);
-  }
-
   DART_FORCE_INLINE void WriteByte(uint8_t value) {
     if (current_ >= end_) {
       Resize(1);
@@ -491,6 +514,7 @@
     ASSERT(end_ > *buffer_);
   }
 
+ private:
   uint8_t** const buffer_;
   uint8_t* end_;
   uint8_t* current_;
diff --git a/runtime/vm/elf.cc b/runtime/vm/elf.cc
index cce2eac..606ef61 100644
--- a/runtime/vm/elf.cc
+++ b/runtime/vm/elf.cc
@@ -962,8 +962,35 @@
         stream_(ASSERT_NOTNULL(stream)),
         address_map_(address_map) {}
 
-  void sleb128(intptr_t value) { stream_->Write(value); }
-  void uleb128(uintptr_t value) { stream_->WriteUnsigned(value); }
+  void sleb128(intptr_t value) {
+    bool is_last_part = false;
+    while (!is_last_part) {
+      uint8_t part = value & 0x7F;
+      value >>= 7;
+      if ((value == 0 && (part & 0x40) == 0) ||
+          (value == static_cast<intptr_t>(-1) && (part & 0x40) != 0)) {
+        is_last_part = true;
+      } else {
+        part |= 0x80;
+      }
+      stream_->WriteFixed(part);
+    }
+  }
+
+  void uleb128(uintptr_t value) {
+    bool is_last_part = false;
+    while (!is_last_part) {
+      uint8_t part = value & 0x7F;
+      value >>= 7;
+      if (value == 0) {
+        is_last_part = true;
+      } else {
+        part |= 0x80;
+      }
+      stream_->WriteFixed(part);
+    }
+  }
+
   void u1(uint8_t value) { stream_->WriteFixed(value); }
   // Can't use WriteFixed for these, as we may not be at aligned positions.
   void u2(uint16_t value) { stream_->WriteBytes(&value, sizeof(value)); }
diff --git a/tests/ffi_2/function_very_many_test.dart b/tests/ffi_2/function_very_many_test.dart
new file mode 100644
index 0000000..8056617
--- /dev/null
+++ b/tests/ffi_2/function_very_many_test.dart
@@ -0,0 +1,299 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Dart test program for testing dart:ffi calls argument passing.
+//
+// VMOptions=
+// VMOptions=--deterministic --optimization-counter-threshold=10
+// VMOptions=--use-slow-path
+// VMOptions=--use-slow-path --stacktrace-every=100
+// VMOptions=--write-protect-code --no-dual-map-code
+// VMOptions=--write-protect-code --no-dual-map-code --use-slow-path
+// VMOptions=--write-protect-code --no-dual-map-code --stacktrace-every=100
+// SharedObjects=ffi_test_functions
+
+import 'dart:ffi';
+
+import 'dylib_utils.dart';
+
+import "package:expect/expect.dart";
+
+void main() {
+  for (int i = 0; i < 100; ++i) {
+    testSumVeryManySmallInts();
+    testSumVeryManyFloatsDoubles();
+  }
+}
+
+final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
+
+VeryManyIntsOp sumVeryManySmallInts =
+    ffiTestFunctions.lookupFunction<NativeVeryManyIntsOp, VeryManyIntsOp>(
+        "SumVeryManySmallInts");
+// Very many small integers, tests alignment on stack.
+void testSumVeryManySmallInts() {
+  Expect.equals(
+      40 * 41 / 2,
+      sumVeryManySmallInts(
+          1,
+          2,
+          3,
+          4,
+          5,
+          6,
+          7,
+          8,
+          9,
+          10,
+          11,
+          12,
+          13,
+          14,
+          15,
+          16,
+          17,
+          18,
+          19,
+          20,
+          21,
+          22,
+          23,
+          24,
+          25,
+          26,
+          27,
+          28,
+          29,
+          30,
+          31,
+          32,
+          33,
+          34,
+          35,
+          36,
+          37,
+          38,
+          39,
+          40));
+}
+
+VeryManyFloatsDoublesOp sumVeryManyFloatsDoubles = ffiTestFunctions
+    .lookupFunction<NativeVeryManyFloatsDoublesOp, VeryManyFloatsDoublesOp>(
+        "SumVeryManyFloatsDoubles");
+
+// Very many floating points, tests alignment on stack, and packing in
+// floating point registers in hardfp.
+void testSumVeryManyFloatsDoubles() {
+  Expect.approxEquals(
+      40.0 * 41.0 / 2.0,
+      sumVeryManyFloatsDoubles(
+          1.0,
+          2.0,
+          3.0,
+          4.0,
+          5.0,
+          6.0,
+          7.0,
+          8.0,
+          9.0,
+          10.0,
+          11.0,
+          12.0,
+          13.0,
+          14.0,
+          15.0,
+          16.0,
+          17.0,
+          18.0,
+          19.0,
+          20.0,
+          21.0,
+          22.0,
+          23.0,
+          24.0,
+          25.0,
+          26.0,
+          27.0,
+          28.0,
+          29.0,
+          30.0,
+          31.0,
+          32.0,
+          33.0,
+          34.0,
+          35.0,
+          36.0,
+          37.0,
+          38.0,
+          39.0,
+          40.0));
+}
+
+typedef NativeVeryManyIntsOp = Int16 Function(
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16,
+    Int8,
+    Int16);
+
+typedef VeryManyIntsOp = int Function(
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int,
+    int);
+
+typedef NativeVeryManyFloatsDoublesOp = Double Function(
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double,
+    Float,
+    Double);
+
+typedef VeryManyFloatsDoublesOp = double Function(
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double);
diff --git a/tests/language/getter/syntax_get_set_syntax_test.dart b/tests/language/getter/syntax_get_set_syntax_test.dart
index dbeaa85..ec18cf9 100644
--- a/tests/language/getter/syntax_get_set_syntax_test.dart
+++ b/tests/language/getter/syntax_get_set_syntax_test.dart
@@ -142,6 +142,7 @@
   List set d;
 //^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
 //         ^
@@ -154,6 +155,7 @@
   List? set e, f;
 //^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //          ^
 // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
 // [cfe] A method declaration needs an explicit list of parameters.
@@ -190,6 +192,7 @@
   List<int> set d;
 //^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
 //              ^
@@ -202,6 +205,7 @@
   List<int>? set e, f;
 //^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //               ^
 // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
 // [cfe] A method declaration needs an explicit list of parameters.
diff --git a/tests/language/setter/setter3_test.dart b/tests/language/setter/setter3_test.dart
index 3dedec6..a8212e4 100644
--- a/tests/language/setter/setter3_test.dart
+++ b/tests/language/setter/setter3_test.dart
@@ -12,12 +12,13 @@
   dynamic set baz(x) {}
 //^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
   bool set bob(x) {}
 //^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //         ^^^
 // [analyzer] COMPILE_TIME_ERROR.BODY_MIGHT_COMPLETE_NORMALLY
-// [cfe] A non-null value must be returned since the return type 'bool' doesn't allow null.
 }
 
 main() {
diff --git a/tests/language/unsorted/index_assign_operator_infer_return_type_test.dart b/tests/language/unsorted/index_assign_operator_infer_return_type_test.dart
index 357c281..1ce5912 100644
--- a/tests/language/unsorted/index_assign_operator_infer_return_type_test.dart
+++ b/tests/language/unsorted/index_assign_operator_infer_return_type_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class C {
-  dynamic operator []=(dynamic index, dynamic value) {}
+  operator []=(dynamic index, dynamic value) {}
 }
 
 abstract class I {
diff --git a/tests/language_2/getter/syntax_get_set_syntax_test.dart b/tests/language_2/getter/syntax_get_set_syntax_test.dart
index 9ccbab1..a275ea8 100644
--- a/tests/language_2/getter/syntax_get_set_syntax_test.dart
+++ b/tests/language_2/getter/syntax_get_set_syntax_test.dart
@@ -142,6 +142,7 @@
   List set d;
 //^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
 //         ^
@@ -154,6 +155,7 @@
   List set e, f;
 //^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //         ^
 // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
 // [cfe] A method declaration needs an explicit list of parameters.
@@ -190,6 +192,7 @@
   List<int> set d;
 //^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //^^^^^^^^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
 //              ^
@@ -202,6 +205,7 @@
   List<int> set e, f;
 //^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 //              ^
 // [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
 // [cfe] A method declaration needs an explicit list of parameters.
diff --git a/tests/language_2/setter/setter3_test.dart b/tests/language_2/setter/setter3_test.dart
index 194ae1c..59a6a7e 100644
--- a/tests/language_2/setter/setter3_test.dart
+++ b/tests/language_2/setter/setter3_test.dart
@@ -12,9 +12,11 @@
   dynamic set baz(x) {}
 //^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
   bool set bob(x) {}
 //^^^^
 // [analyzer] COMPILE_TIME_ERROR.NON_VOID_RETURN_FOR_SETTER
+// [cfe] The return type of the setter must be 'void' or absent.
 }
 
 main() {
diff --git a/tests/language_2/super/setter_test.dart b/tests/language_2/super/setter_test.dart
index f5be400..c2a9567 100644
--- a/tests/language_2/super/setter_test.dart
+++ b/tests/language_2/super/setter_test.dart
@@ -10,7 +10,8 @@
   String value_;
 
   String get value { return value_; }
-  String set value(String newValue) { //# static warning
+  String //# 01: compile-time error
+  set value(String newValue) {
     value_ = 'Base:$newValue';
   }
 }
@@ -19,7 +20,8 @@
 class Derived extends Base {
   Derived() : super() {}
 
-  String set value(String newValue) { //# static warning
+  String //# 02: compile-time error
+  set value(String newValue) {
     super.value = 'Derived:$newValue';
   }
   String get value { return super.value; }
diff --git a/tests/language_2/unsorted/index_assign_operator_infer_return_type_test.dart b/tests/language_2/unsorted/index_assign_operator_infer_return_type_test.dart
index 357c281..1ce5912 100644
--- a/tests/language_2/unsorted/index_assign_operator_infer_return_type_test.dart
+++ b/tests/language_2/unsorted/index_assign_operator_infer_return_type_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class C {
-  dynamic operator []=(dynamic index, dynamic value) {}
+  operator []=(dynamic index, dynamic value) {}
 }
 
 abstract class I {
diff --git a/tools/VERSION b/tools/VERSION
index 2eff400..193d231 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 88
+PRERELEASE 89
 PRERELEASE_PATCH 0
\ No newline at end of file