Commit b3e4c743 authored by Vít Starý Novotný's avatar Vít Starý Novotný
Browse files

Added if and if-else tests for the LLVM compiler.

parent 0a5c96bc
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -229,12 +229,10 @@ void LLVMParser::grammar_callable_declaration()
    get_current_out() << " @GLOBAL_" << name_token.term.payload
                      << "(" << out_buffer.str() << ") {" << std::endl;
    grammar_block();
    auto& offset = symbols.find("metadata::current_offset").second.offset;
    if (return_type == DT_INTEGER)
        get_current_out() << "ret i32 0";
    else
        get_current_out() << "ret double 0.000000e+00";
    offset += 2;
    get_current_out() << std::endl
                      << "}" << std::endl;
    symbols.pop();
@@ -355,6 +353,7 @@ void LLVMParser::grammar_statement(const std::string& label_next)
            else
                get_current_out() << "double";
            get_current_out() << " %" << loaded_storage_offset << std::endl;
            get_next_offset();
        } else { // Print the returned value, when we are in the global scope.
            get_current_out() << "call i32 (i8*, ...) @printf(i8* getelementptr inbounds (";
            if (coerced_type == DT_INTEGER)
@@ -363,6 +362,7 @@ void LLVMParser::grammar_statement(const std::string& label_next)
                get_current_out() << "[5 x i8], [5 x i8]* @.print_double, i32 0, i32 0), double %";
            get_current_out() << loaded_storage_offset << ")" << std::endl
                              << "ret i32 0" << std::endl;
            get_next_offset();
        }
    } else {
        auto name_token = token;
@@ -824,7 +824,7 @@ void LLVMParser::grammar_bool_operand(
        if (token.term.payload == "true")
            get_current_out() << "br label %" << label_true << std::endl;
        else
            get_current_out() << "br label %" << label_true << std::endl;
            get_current_out() << "br label %" << label_false << std::endl;
    } else {
        size_t loaded_storage_offset = grammar_relation_expression();
        get_current_out() << "br i1 %" << loaded_storage_offset
+2 −0
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@ private:
    void write_label(const std::string& label)
    {
        get_current_out() << label << ":" << std::endl;
        if (symbols.find("metadata::current_offset").second.offset > 1)
            get_next_offset();
    }
    size_t get_next_offset()
    {
+12 −0
Original line number Diff line number Diff line
@@ -361,3 +361,15 @@ TEST(Phase03_LLVMParser, coercionsInt32ToDouble)
        EXPECT_THROW(string_to_integer(compile_and_run(input)), std::invalid_argument);
    }
}

TEST(Phase03_LLVMParser, if)
{
    EXPECT_EQ(1, string_to_integer(compile_and_run("if true then return 1; fi; return 0;")));
    EXPECT_EQ(0, string_to_integer(compile_and_run("if false then return 1; fi; return 0;")));
}

TEST(Phase03_LLVMParser, ifElse)
{
    EXPECT_EQ(1, string_to_integer(compile_and_run("if true then return 1; else return 0; fi;")));
    EXPECT_EQ(0, string_to_integer(compile_and_run("if false then return 1; else return 0; fi;")));
}