dart-lang / sdk

The Dart SDK, including the VM, dart2js, core libraries, and more.
https://dart.dev
BSD 3-Clause "New" or "Revised" License
9.94k stars 1.53k forks source link

The analyzer encounters an unhandled exception during constant verification in a switch statement #56117

Open eernstg opened 3 days ago

eernstg commented 3 days ago

Consider the following program:

sealed class C<A> {
  const C._();
  factory C(A value) = ConcreteC;
  C<B> Function<B>(C<B> Function(A)) get bar;
}

class ConcreteC<A> extends C<A> {
  final List<A> list;

  ConcreteC(A value) : list = [value], super._();

  @override
  get bar => <B>(C<B> Function(A) f) {
    var e = f(list.first);
    switch (e) {
      case FailedC():
        return e;
      case ConcreteC():
        break;
    }
    return ConcreteC<B>(throw "Whatever");
  };
}

abstract class FailedC extends C<Never> {
  const FailedC() : super._();
}

void main() {}

This program is accepted by the CFE and runs with no errors, but the analyzer encounters an unhandled exception:

Stack trace ``` Analyzing n020.dart... An unexpected error was encountered by the Analysis Server. Please file an issue at https://github.com/dart-lang/sdk/issues/new/choose with the following details: Internal error: Null check operator used on a null value #0 TypeParameterReplacer.visitTypeParameterType (package:analyzer/src/generated/exhaustiveness.dart:767:44) #1 TypeParameterTypeImpl.accept (package:analyzer/src/dart/element/type.dart:1488:20) #2 ReplacementVisitor.visitTypeArgument (package:analyzer/src/dart/element/replacement_visitor.dart:523:21) #3 ReplacementVisitor._typeArguments (package:analyzer/src/dart/element/replacement_visitor.dart:570:26) #4 ReplacementVisitor.visitInterfaceType (package:analyzer/src/dart/element/replacement_visitor.dart:375:28) #5 InterfaceTypeImpl.accept (package:analyzer/src/dart/element/type.dart:714:20) #6 TypeParameterReplacer._replaceTypeParameterTypes (package:analyzer/src/generated/exhaustiveness.dart:773:17) #7 TypeParameterReplacer.replaceTypeVariables (package:analyzer/src/generated/exhaustiveness.dart:778:46) #8 AnalyzerTypeOperations.overapproximate (package:analyzer/src/generated/exhaustiveness.dart:392:34) #9 SealedClassStaticType._createSubtypes (package:_fe_analyzer_shared/src/exhaustiveness/types/sealed.dart:94:40) #10 SealedClassStaticType.getSubtypes (package:_fe_analyzer_shared/src/exhaustiveness/types/sealed.dart:68:21) #11 _Checker._unmatched (package:_fe_analyzer_shared/src/exhaustiveness/exhaustive.dart:143:31) #12 reportErrors (package:_fe_analyzer_shared/src/exhaustiveness/exhaustive.dart:48:38) #13 ConstantVerifier._validateSwitchExhaustiveness (package:analyzer/src/dart/constant/constant_verifier.dart:943:11) #14 ConstantVerifier.visitSwitchStatement. (package:analyzer/src/dart/constant/constant_verifier.dart:462:9) #15 ConstantVerifier._withConstantPatternValues (package:analyzer/src/dart/constant/constant_verifier.dart:1059:6) #16 ConstantVerifier.visitSwitchStatement (package:analyzer/src/dart/constant/constant_verifier.dart:459:5) #17 SwitchStatementImpl.accept (package:analyzer/src/dart/ast/ast.dart:16956:50) #18 NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:12583:20) #19 BlockImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2091:17) #20 RecursiveAstVisitor.visitBlock (package:analyzer/dart/ast/visitor.dart:894:10) #21 BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:2087:50) #22 BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2047:12) #23 RecursiveAstVisitor.visitBlockFunctionBody (package:analyzer/dart/ast/visitor.dart:900:10) #24 BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:2039:50) #25 FunctionExpressionImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:8310:11) #26 RecursiveAstVisitor.visitFunctionExpression (package:analyzer/dart/ast/visitor.dart:1224:10) #27 ConstantVerifier.visitFunctionExpression (package:analyzer/src/dart/constant/constant_verifier.dart:225:11) #28 FunctionExpressionImpl.accept (package:analyzer/src/dart/ast/ast.dart:8299:50) #29 ExpressionFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:5973:17) #30 RecursiveAstVisitor.visitExpressionFunctionBody (package:analyzer/dart/ast/visitor.dart:1104:10) #31 ExpressionFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:5965:15) #32 MethodDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:11693:10) #33 RecursiveAstVisitor.visitMethodDeclaration (package:analyzer/dart/ast/visitor.dart:1422:10) #34 ConstantVerifier.visitMethodDeclaration (package:analyzer/src/dart/constant/constant_verifier.dart:366:11) #35 MethodDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:11685:50) #36 NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:12583:20) #37 ClassDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2954:13) #38 RecursiveAstVisitor.visitClassDeclaration (package:analyzer/dart/ast/visitor.dart:948:10) #39 ClassDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:2944:50) #40 NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:12583:20) #41 CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:3614:21) #42 RecursiveAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:972:10) #43 CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:3607:50) #44 LibraryAnalyzer._computeConstantErrors (package:analyzer/src/dart/analysis/library_analyzer.dart:265:23) #45 LibraryAnalyzer._computeVerifyErrors (package:analyzer/src/dart/analysis/library_analyzer.dart:415:5) #46 LibraryAnalyzer._computeDiagnostics (package:analyzer/src/dart/analysis/library_analyzer.dart:292:7) #47 LibraryAnalyzer.analyze (package:analyzer/src/dart/analysis/library_analyzer.dart:108:5) #48 AnalysisDriver._analyzeFileImpl. (package:analyzer/src/dart/analysis/driver.dart:1394:11) #49 PerformanceLog.runAsync (package:analyzer/src/dart/analysis/performance_logger.dart:50:14) #50 AnalysisDriver._analyzeFile. (package:analyzer/src/dart/analysis/driver.dart:1308:9) #51 OperationPerformanceImpl.runAsync (package:analyzer/src/util/performance/operation_performance.dart:174:14) #52 AnalysisDriver._analyzeFile (package:analyzer/src/dart/analysis/driver.dart:1305:5) #53 AnalysisDriver._produceErrors (package:analyzer/src/dart/analysis/driver.dart:2020:5) #54 AnalysisDriver.performWork (package:analyzer/src/dart/analysis/driver.dart:1245:7) #55 AnalysisDriverScheduler._run (package:analyzer/src/dart/analysis/driver.dart:2449:7) null ```
bwilkerson commented 3 days ago

@scheglov