[wildcards] local function `DUPLICATE_DEFINITION` support

See: https://github.com/dart-lang/sdk/issues/56089

Fixes:

CompileTimeError -> Pass (expected Pass)
co19/LanguageFeatures/Wildcards/binding_A02_t05

Change-Id: Icf996952a4f87f71cc64cecf7ac539df363c3db6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380045
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index fc548ed..0052892 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -93,11 +93,13 @@
               element: variable.declaredElement!);
         }
       } else if (statement is FunctionDeclarationStatement) {
-        _checkDuplicateIdentifier(
-          definedNames,
-          statement.functionDeclaration.name,
-          element: statement.functionDeclaration.declaredElement!,
-        );
+        if (!_isWildCardFunction(statement)) {
+          _checkDuplicateIdentifier(
+            definedNames,
+            statement.functionDeclaration.name,
+            element: statement.functionDeclaration.declaredElement!,
+          );
+        }
       } else if (statement is PatternVariableDeclarationStatementImpl) {
         for (var variable in statement.declaration.elements) {
           _checkDuplicateIdentifier(definedNames, variable.node.name,
@@ -264,6 +266,10 @@
     }
   }
 
+  bool _isWildCardFunction(FunctionDeclarationStatement statement) =>
+      statement.functionDeclaration.name.lexeme == '_' &&
+      _currentLibrary.hasWildcardVariablesFeatureEnabled;
+
   static bool _isGetterSetterPair(Element a, Element b) {
     if (a is PropertyAccessorElement && b is PropertyAccessorElement) {
       return a.isGetter && b.isSetter || a.isSetter && b.isGetter;
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
index 503e8d0..4e903f0 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
@@ -2384,6 +2384,41 @@
 
 @reflectiveTest
 class DuplicateDefinitionTest extends PubPackageResolutionTest {
+  test_block_localFunction_wildcard() async {
+    await assertErrorsInCode(r'''
+void f() {
+  void _() {}
+  int _(int _) => 42;
+  String _(int _) => "42";
+}
+''', [
+      error(WarningCode.DEAD_CODE, 13, 11),
+      error(WarningCode.DEAD_CODE, 27, 19),
+      error(WarningCode.DEAD_CODE, 49, 24),
+    ]);
+  }
+
+  test_block_localFunction_wildcard_preWildcards() async {
+    await assertErrorsInCode(r'''
+// @dart = 3.4
+// (pre wildcard-variables)
+
+void f() {
+  void _() {}
+  int _(int _) => 42;
+  String _(int _) => "42";
+}
+''', [
+      error(WarningCode.UNUSED_ELEMENT, 62, 1),
+      error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 75, 1,
+          contextMessages: [message(testFile, 62, 1)]),
+      error(WarningCode.UNUSED_ELEMENT, 75, 1),
+      error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 100, 1,
+          contextMessages: [message(testFile, 62, 1)]),
+      error(WarningCode.UNUSED_ELEMENT, 100, 1),
+    ]);
+  }
+
   test_block_localVariable_localVariable() async {
     await assertErrorsInCode(r'''
 void f() {