anchor.diff:      parseNNBDCompilationUnit('main() { C.a? Function()? x = 7; }');
     }
   
  +  void test_is_nullable() {
  +    CompilationUnit unit =
  +        parseNNBDCompilationUnit('main() { x is String? ? (x + y) : z; }');
  +    FunctionDeclaration function = unit.declarations[0];
  +    BlockFunctionBody body = function.functionExpression.body;
  +    ExpressionStatement statement = body.block.statements[0];
  +    ConditionalExpression expression = statement.expression;
  +
  +    IsExpression condition = expression.condition;
  +    expect((condition.type as NamedType).question, isNotNull);
  +    Expression thenExpression = expression.thenExpression;
  +    expect(thenExpression, isParenthesizedExpression);
  +    Expression elseExpression = expression.elseExpression;
  +    expect(elseExpression, isSimpleIdentifier);
  +  }
  +
  +  void test_is_nullable_parenthesis() {
  +    CompilationUnit unit =
  +        parseNNBDCompilationUnit('main() { (x is String?) ? (x + y) : z; }');
  +    FunctionDeclaration function = unit.declarations[0];
  +    BlockFunctionBody body = function.functionExpression.body;
  +    ExpressionStatement statement = body.block.statements[0];
  +    ConditionalExpression expression = statement.expression;
  +
  +    ParenthesizedExpression condition = expression.condition;
  +    IsExpression isExpression = condition.expression;
  +    expect((isExpression.type as NamedType).question, isNotNull);
  +    Expression thenExpression = expression.thenExpression;
  +    expect(thenExpression, isParenthesizedExpression);
  +    Expression elseExpression = expression.elseExpression;
  +    expect(elseExpression, isSimpleIdentifier);
  +  }
  +
     void test_nullCheck() {
       var unit = parseNNBDCompilationUnit('f(int? y) { var x = y!; }');
       FunctionDeclaration function = unit.declarations[0];
  
positive.code:     ]);
    }
  
    @failingTest
    void test_nullCheckOnLiteral() {
      // TODO(danrubel): Report error for null check on invalid target
      parseNNBDCompilationUnit('f() { var x = 0!; }',
          errors: [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 78, 1)]);
    }
  
    void test_nullCheckOnLiteral_disabled() {
  
negative.code:         errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 24, 1)]);
    }
  
    void test_nullCheckParenthesizedExpression() {
      parseNNBDCompilationUnit('f(int? y) { var x = (y)! + 7; }');
    }
  
    void test_nullCheckPropertyAccess() {
      parseNNBDCompilationUnit('f() { var x = g.p! + 7; }');
    }
  
    void test_nullCheckPropertyAccess2() {
      parseNNBDCompilationUnit('f() { var x = g?.p! + 7; }');
    }
  
    void test_nullCheckPropertyAccess3() {
      parseNNBDCompilationUnit('f() { var x = super.p! + 7; }');
    }
  
    void test_pragma_missing() {
  