@Override
 public TypeResult<StatementTypeCheckResult> typeCheck(
     ReturnNode returnStatement, Option<Type> returnType) {
   TypeResultBuilder<StatementTypeCheckResult> typeResult =
       typeResultBuilder(StatementTypeCheckResult.alwaysReturns());
   ExpressionNode expression = returnStatement.getExpression();
   TypeResult<Type> expressionTypeResult = typeInferer.inferType(expression);
   typeResult.addErrors(expressionTypeResult);
   if (!returnType.hasValue()) {
     typeResult.addError(error(returnStatement, new CannotReturnHereError()));
   } else if (expressionTypeResult.hasValue()
       && !subTyping.isSubType(expressionTypeResult.getOrThrow(), returnType.get())) {
     typeResult.addError(
         error(
             expression,
             new WrongReturnTypeError(returnType.get(), expressionTypeResult.getOrThrow())));
   }
   return typeResult.build();
 }
  @Test
  public void functionSignatureDoesNotReturn() {
    TypeResult<StatementTypeCheckResult> result = typeCheck(funcSignature);

    assertThat(result, isSuccessWithValue(StatementTypeCheckResult.noReturn()));
  }