public void Integer_literal_that_is_too_large_fails() { var position = new TextPosition(10, 3, 4); var syntax = new IntegerLiteralSyntax((ulong)int.MaxValue + 1, position); var method = new CompiledMethod("Test::Method"); var builder = new BasicBlockGraphBuilder().GetInitialBlockBuilder(); var nameResolver = new TestingResolver(new ScopedVariableMap()); var diagnostics = new TestingDiagnosticSink(); var localIndex = ExpressionCompiler.TryCompileExpression( syntax, SimpleType.Int32, method, builder, nameResolver, diagnostics); Assert.That(localIndex, Is.EqualTo(-1)); diagnostics.AssertDiagnosticAt(DiagnosticCode.TypeMismatch, position) .WithActual("uint32").WithExpected("int32"); }
public void Variable_reference_must_refer_to_existent_variable() { var position = new TextPosition(10, 3, 4); var syntax = new IdentifierSyntax("a", position); var method = new CompiledMethod("Test::Method"); var builder = new BasicBlockGraphBuilder().GetInitialBlockBuilder(); var diagnostics = new TestingDiagnosticSink(); var variableMap = new ScopedVariableMap(); variableMap.PushScope(); var localIndex = ExpressionCompiler.TryCompileExpression( syntax, SimpleType.Int32, method, builder, new TestingResolver(variableMap), diagnostics); Assert.That(localIndex, Is.EqualTo(-1)); diagnostics.AssertDiagnosticAt(DiagnosticCode.VariableNotFound, position).WithActual("a"); }
public void Int32_division_by_zero_in_constant_expression_fails(BinaryOperation op) { var position = new TextPosition(10, 3, 4); var syntax = new BinaryExpressionSyntax(op, new IntegerLiteralSyntax(2ul, default), new IntegerLiteralSyntax(0, default), position); var method = new CompiledMethod("Test::Method"); var builder = new BasicBlockGraphBuilder().GetInitialBlockBuilder(); var diagnostics = new TestingDiagnosticSink(); var nameResolver = new TestingResolver(new ScopedVariableMap()); var localIndex = ExpressionCompiler.TryCompileExpression( syntax, SimpleType.Int32, method, builder, nameResolver, diagnostics); Assert.That(localIndex, Is.EqualTo(-1)); diagnostics.AssertDiagnosticAt(DiagnosticCode.DivisionByConstantZero, position); }
public void Operator_not_defined_for_type_in_non_constant(string expressionString, string operatorName, string typeName) { var expressionSyntax = ParseExpression(expressionString); var method = new CompiledMethod("Test::Method"); var builder = new BasicBlockGraphBuilder().GetInitialBlockBuilder(); var diagnostics = new TestingDiagnosticSink(); var variableMap = new ScopedVariableMap(); variableMap.PushScope(); variableMap.TryAddVariable("b", method.AddLocal(SimpleType.Bool, LocalFlags.None)); variableMap.TryAddVariable("i", method.AddLocal(SimpleType.Int32, LocalFlags.None)); var localIndex = ExpressionCompiler.TryCompileExpression( expressionSyntax, SimpleType.Void, method, builder, new TestingResolver(variableMap), diagnostics); Assert.That(localIndex, Is.EqualTo(-1)); diagnostics.AssertDiagnosticAt(DiagnosticCode.OperatorNotDefined, expressionSyntax.Position) .WithActual(operatorName).WithExpected(typeName); }
public void Variable_reference_must_have_correct_type() { var position = new TextPosition(10, 3, 4); var syntax = new IdentifierSyntax("a", position); var method = new CompiledMethod("Test::Method"); var builder = new BasicBlockGraphBuilder().GetInitialBlockBuilder(); var diagnostics = new TestingDiagnosticSink(); var variableMap = new ScopedVariableMap(); variableMap.PushScope(); variableMap.TryAddVariable("a", 0); method.AddLocal(SimpleType.Bool, LocalFlags.None); var localIndex = ExpressionCompiler.TryCompileExpression( syntax, SimpleType.Int32, method, builder, new TestingResolver(variableMap), diagnostics); Assert.That(localIndex, Is.EqualTo(-1)); diagnostics.AssertDiagnosticAt(DiagnosticCode.TypeMismatch, position) .WithActual("bool").WithExpected("int32"); }