[CFE] Fix crash on invalid this references

Change-Id: If6a323a7cc2defab3a0f7844b948719c49fef483
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/395301
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index c7f31c4..6a99203 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -3292,6 +3292,10 @@
           // semantics, such parameters introduces a new parameter with that
           // name that should be resolved here.
           !_context.isConstructor) {
+        if (declaration.isExtensionTypeInstanceMember) {
+          return new IncompleteErrorGenerator(
+              this, nameToken, fasta.messageNotAConstantExpression);
+        }
         addProblem(
             fasta.messageNotAConstantExpression, nameOffset, nameToken.length);
       }
@@ -7178,8 +7182,13 @@
     debugEvent("ThisExpression");
     if (context.isScopeReference && isDeclarationInstanceContext) {
       if (thisVariable != null && !inConstructorInitializer) {
-        push(_createReadOnlyVariableAccess(thisVariable!, token,
-            offsetForToken(token), 'this', ReadOnlyAccessKind.ExtensionThis));
+        if (constantContext != ConstantContext.none) {
+          push(new IncompleteErrorGenerator(
+              this, token, fasta.messageThisAsIdentifier));
+        } else {
+          push(_createReadOnlyVariableAccess(thisVariable!, token,
+              offsetForToken(token), 'this', ReadOnlyAccessKind.ExtensionThis));
+        }
       } else {
         push(new ThisAccessGenerator(this, token, inInitializerLeftHandSide,
             inFieldInitializer, inLateFieldInitializer));
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index e178169..cab162b 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -348,6 +348,7 @@
 forbidden
 forces
 foreground
+forgot
 forrest
 forth
 forty
@@ -577,6 +578,7 @@
 oobar
 oocf
 ooo
+oops
 oovf
 opacity
 operate
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart
new file mode 100644
index 0000000..07dc796
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2024, 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.
+
+extension type Foo(String x) {
+  int x2 = 42;
+
+  @x2
+  int? a, b;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.expect b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.expect
new file mode 100644
index 0000000..1711f58
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:6:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:9:8: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? a, b;
+//        ^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get a() → core::int?;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get b() → core::int?;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */ {
+  lowered final self::Foo% /* erasure=core::String, declared=! */ #this = x;
+  return #this;
+}
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.modular.expect b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.modular.expect
new file mode 100644
index 0000000..1711f58
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.modular.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:6:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:9:8: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? a, b;
+//        ^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get a() → core::int?;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get b() → core::int?;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */ {
+  lowered final self::Foo% /* erasure=core::String, declared=! */ #this = x;
+  return #this;
+}
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.outline.expect
new file mode 100644
index 0000000..0db5e8e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.outline.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:6:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:9:8: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? a, b;
+//        ^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get a() → core::int?;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get b() → core::int?;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  ;
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.transformed.expect
new file mode 100644
index 0000000..1711f58
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:6:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:9:8: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int? a, b;
+//        ^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get a() → core::int?;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_01.dart:8:4: Error: Not a constant expression.
+  @x2
+   ^^"
+  abstract extension-type-member representation-field get b() → core::int?;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */ {
+  lowered final self::Foo% /* erasure=core::String, declared=! */ #this = x;
+  return #this;
+}
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.textual_outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.textual_outline.expect
new file mode 100644
index 0000000..3d5a22a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+extension type Foo(String x) {
+  int x2 = 42;
+  @x2
+  int? a, b;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4ff42a6
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_01.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+extension type Foo(String x) {
+  @x2
+  int? a, b;
+  int x2 = 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart
new file mode 100644
index 0000000..01bfe8c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2024, 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.
+
+extension type Foo(String x) {
+  static const int x1 = 42;
+  int x2 = 42;
+
+  int bar1({int baz = x2}) => 42;
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.expect b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.expect
new file mode 100644
index 0000000..5a97b5b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:7:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+//   int bar1({int baz = x2}) => 42;
+//                       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+//   int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  static field x1 = self::Foo|x1;
+  method bar1 = self::Foo|bar1;
+  method tearoff bar1 = self::Foo|get#bar1;
+  method bar2 = self::Foo|bar2;
+  method tearoff bar2 = self::Foo|get#bar2;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static const field core::int Foo|x1 = #C1;
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */ {
+  lowered final self::Foo% /* erasure=core::String, declared=! */ #this = x;
+  return #this;
+}
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
+static extension-type-member method Foo|bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+  int bar1({int baz = x2}) => 42;
+                      ^^"}) → core::int
+  return 42;
+static extension-type-member method Foo|get#bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+  int bar1({int baz = x2}) => 42;
+                      ^^"}) → core::int => self::Foo|bar1(#this, baz: baz);
+static extension-type-member method Foo|bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+                      ^"}) → core::int
+  return 42;
+static extension-type-member method Foo|get#bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+                      ^"}) → core::int => self::Foo|bar2(#this, baz: baz);
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.modular.expect b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.modular.expect
new file mode 100644
index 0000000..5a97b5b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.modular.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:7:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+//   int bar1({int baz = x2}) => 42;
+//                       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+//   int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  static field x1 = self::Foo|x1;
+  method bar1 = self::Foo|bar1;
+  method tearoff bar1 = self::Foo|get#bar1;
+  method bar2 = self::Foo|bar2;
+  method tearoff bar2 = self::Foo|get#bar2;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static const field core::int Foo|x1 = #C1;
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */ {
+  lowered final self::Foo% /* erasure=core::String, declared=! */ #this = x;
+  return #this;
+}
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
+static extension-type-member method Foo|bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+  int bar1({int baz = x2}) => 42;
+                      ^^"}) → core::int
+  return 42;
+static extension-type-member method Foo|get#bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+  int bar1({int baz = x2}) => 42;
+                      ^^"}) → core::int => self::Foo|bar1(#this, baz: baz);
+static extension-type-member method Foo|bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+                      ^"}) → core::int
+  return 42;
+static extension-type-member method Foo|get#bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+                      ^"}) → core::int => self::Foo|bar2(#this, baz: baz);
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.outline.expect
new file mode 100644
index 0000000..e3e93ee
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.outline.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:7:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  static field x1 = self::Foo|x1;
+  method bar1 = self::Foo|bar1;
+  method tearoff bar1 = self::Foo|get#bar1;
+  method bar2 = self::Foo|bar2;
+  method tearoff bar2 = self::Foo|get#bar2;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static const field core::int Foo|x1 = 42;
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  ;
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
+static extension-type-member method Foo|bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {has-declared-initializer core::int baz}) → core::int
+  ;
+static extension-type-member method Foo|get#bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz}) → core::int => self::Foo|bar1(#this, baz: baz);
+static extension-type-member method Foo|bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {has-declared-initializer core::int baz}) → core::int
+  ;
+static extension-type-member method Foo|get#bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz}) → core::int => self::Foo|bar2(#this, baz: baz);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.transformed.expect
new file mode 100644
index 0000000..5a97b5b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:7:7: Error: Extension types can't declare instance fields
+// Try removing the field declaration or making it a static field
+//   int x2 = 42;
+//       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+//   int bar1({int baz = x2}) => 42;
+//                       ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+//   int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+//                       ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension type Foo(core::String x) {
+  abstract extension-type-member representation-field get x() → core::String;
+  abstract extension-type-member representation-field get x2() → core::int;
+  static field x1 = self::Foo|x1;
+  method bar1 = self::Foo|bar1;
+  method tearoff bar1 = self::Foo|get#bar1;
+  method bar2 = self::Foo|bar2;
+  method tearoff bar2 = self::Foo|get#bar2;
+  constructor • = self::Foo|constructor#;
+  constructor tearoff • = self::Foo|constructor#_#new#tearOff;
+}
+static const field core::int Foo|x1 = #C1;
+static extension-type-member method Foo|constructor#(core::String x) → self::Foo% /* erasure=core::String, declared=! */ {
+  lowered final self::Foo% /* erasure=core::String, declared=! */ #this = x;
+  return #this;
+}
+static extension-type-member method Foo|constructor#_#new#tearOff(core::String x) → self::Foo% /* erasure=core::String, declared=! */
+  return self::Foo|constructor#(x);
+static extension-type-member method Foo|bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+  int bar1({int baz = x2}) => 42;
+                      ^^"}) → core::int
+  return 42;
+static extension-type-member method Foo|get#bar1(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:9:23: Error: Not a constant expression.
+  int bar1({int baz = x2}) => 42;
+                      ^^"}) → core::int => self::Foo|bar1(#this, baz: baz);
+static extension-type-member method Foo|bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+                      ^"}) → core::int
+  return 42;
+static extension-type-member method Foo|get#bar2(lowered final self::Foo% /* erasure=core::String, declared=! */ #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_02.dart:10:23: Error: Not a constant expression.
+  int bar2({int baz = x /* oops forgot the 1 */}) => 42;
+                      ^"}) → core::int => self::Foo|bar2(#this, baz: baz);
+
+constants  {
+  #C1 = 42
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.textual_outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.textual_outline.expect
new file mode 100644
index 0000000..2781a50
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+extension type Foo(String x) {
+  static const int x1 = 42;
+  int x2 = 42;
+  int bar1({int baz = x2}) => 42;
+  int bar2({int baz = x}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..bc6d65f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_02.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+extension type Foo(String x) {
+  int bar1({int baz = x2}) => 42;
+  int bar2({int baz = x}) => 42;
+  int x2 = 42;
+  static const int x1 = 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart
new file mode 100644
index 0000000..0cb6499
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2024, 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.
+
+extension on int {
+  int bar({int baz = this}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.expect b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.expect
new file mode 100644
index 0000000..f56327f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.expect
@@ -0,0 +1,23 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+//   int bar({int baz = this}) => 42;
+//                      ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension /* unnamed */ _extension#0 on core::int {
+  method bar = self::_extension#0|bar;
+  method tearoff bar = self::_extension#0|get#bar;
+}
+static extension-member method _extension#0|bar(lowered final core::int #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+  int bar({int baz = this}) => 42;
+                     ^^^^"}) → core::int
+  return 42;
+static extension-member method _extension#0|get#bar(lowered final core::int #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+  int bar({int baz = this}) => 42;
+                     ^^^^"}) → core::int => self::_extension#0|bar(#this, baz: baz);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.modular.expect b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.modular.expect
new file mode 100644
index 0000000..f56327f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.modular.expect
@@ -0,0 +1,23 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+//   int bar({int baz = this}) => 42;
+//                      ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension /* unnamed */ _extension#0 on core::int {
+  method bar = self::_extension#0|bar;
+  method tearoff bar = self::_extension#0|get#bar;
+}
+static extension-member method _extension#0|bar(lowered final core::int #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+  int bar({int baz = this}) => 42;
+                     ^^^^"}) → core::int
+  return 42;
+static extension-member method _extension#0|get#bar(lowered final core::int #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+  int bar({int baz = this}) => 42;
+                     ^^^^"}) → core::int => self::_extension#0|bar(#this, baz: baz);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.outline.expect
new file mode 100644
index 0000000..a5109de
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension /* unnamed */ _extension#0 on core::int {
+  method bar = self::_extension#0|bar;
+  method tearoff bar = self::_extension#0|get#bar;
+}
+static extension-member method _extension#0|bar(lowered final core::int #this, {has-declared-initializer core::int baz}) → core::int
+  ;
+static extension-member method _extension#0|get#bar(lowered final core::int #this) → ({baz: core::int}) → core::int
+  return ({core::int baz}) → core::int => self::_extension#0|bar(#this, baz: baz);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.transformed.expect
new file mode 100644
index 0000000..f56327f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+//   int bar({int baz = this}) => 42;
+//                      ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension /* unnamed */ _extension#0 on core::int {
+  method bar = self::_extension#0|bar;
+  method tearoff bar = self::_extension#0|get#bar;
+}
+static extension-member method _extension#0|bar(lowered final core::int #this, {core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+  int bar({int baz = this}) => 42;
+                     ^^^^"}) → core::int
+  return 42;
+static extension-member method _extension#0|get#bar(lowered final core::int #this) → ({baz: core::int}) → core::int
+  return ({core::int baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_03.dart:6:22: Error: Expected identifier, but got 'this'.
+  int bar({int baz = this}) => 42;
+                     ^^^^"}) → core::int => self::_extension#0|bar(#this, baz: baz);
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.textual_outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.textual_outline.expect
new file mode 100644
index 0000000..a60f2ae
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+extension on int {
+  int bar({int baz = this}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..a60f2ae
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_03.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+extension on int {
+  int bar({int baz = this}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart
new file mode 100644
index 0000000..bb1127a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2024, 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.
+
+class Foo {
+  int bar({dynamic baz = this}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.expect b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.expect
new file mode 100644
index 0000000..cde8da7
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+//   int bar({dynamic baz = this}) => 42;
+//                          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  method bar({dynamic baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+  int bar({dynamic baz = this}) => 42;
+                         ^^^^"}) → core::int
+    return 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.modular.expect b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.modular.expect
new file mode 100644
index 0000000..cde8da7
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.modular.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+//   int bar({dynamic baz = this}) => 42;
+//                          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  method bar({dynamic baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+  int bar({dynamic baz = this}) => 42;
+                         ^^^^"}) → core::int
+    return 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.outline.expect
new file mode 100644
index 0000000..6c4e26f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.outline.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+//   int bar({dynamic baz = this}) => 42;
+//                          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    ;
+  method bar({dynamic baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+  int bar({dynamic baz = this}) => 42;
+                         ^^^^"}) → core::int
+    ;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.transformed.expect
new file mode 100644
index 0000000..cde8da7
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+//   int bar({dynamic baz = this}) => 42;
+//                          ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  method bar({dynamic baz = invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_04.dart:6:26: Error: Expected identifier, but got 'this'.
+  int bar({dynamic baz = this}) => 42;
+                         ^^^^"}) → core::int
+    return 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.textual_outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.textual_outline.expect
new file mode 100644
index 0000000..5080d0a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+class Foo {
+  int bar({dynamic baz = this}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5080d0a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_04.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+class Foo {
+  int bar({dynamic baz = this}) => 42;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart
new file mode 100644
index 0000000..72b12d5
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2024, 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.
+
+class Foo {
+  int x2 = 42;
+
+  @x2
+  int? a, b;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.expect b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.expect
new file mode 100644
index 0000000..ee832f72
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int x2 = 42;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^"
+  field core::int? a = null;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^"
+  field core::int? b = null;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.modular.expect b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.modular.expect
new file mode 100644
index 0000000..ee832f72
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.modular.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int x2 = 42;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^"
+  field core::int? a = null;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^"
+  field core::int? b = null;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.outline.expect
new file mode 100644
index 0000000..cd0208c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.outline.expect
@@ -0,0 +1,28 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int x2;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in this.{self::Foo::x2}{core::int}
+  field core::int? a;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^" in this.{self::Foo::x2}{core::int}
+  field core::int? b;
+  synthetic constructor •() → self::Foo
+    ;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.transformed.expect
new file mode 100644
index 0000000..ee832f72
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: Not a constant expression.
+//   @x2
+//    ^^
+//
+// pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+//   @x2
+//    ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int x2 = 42;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^"
+  field core::int? a = null;
+  @invalid-expression "pkg/front_end/testcases/regress/invalid_this_reference_05.dart:8:4: Error: This can't be used as an annotation; an annotation should be a reference to a compile-time constant variable, or a call to a constant constructor.
+  @x2
+   ^"
+  field core::int? b = null;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.textual_outline.expect b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.textual_outline.expect
new file mode 100644
index 0000000..9a7b0d0
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+class Foo {
+  int x2 = 42;
+  @x2
+  int? a, b;
+}
diff --git a/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..59f3c0a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/invalid_this_reference_05.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class Foo {
+  @x2
+  int? a, b;
+  int x2 = 42;
+}