"""
Tests that rvalue references are supported in C++
"""

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class RvalueReferencesTestCase(TestBase):
    # rdar://problem/11479676
    @expectedFailureAll(
        compiler="icc",
        bugnumber="ICC (13.1, 14-beta) do not emit DW_TAG_rvalue_reference_type.",
    )
    def test_with_run_command(self):
        """Test that rvalues are supported in the C++ expression parser"""
        self.build()
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)

        self.set_breakpoint(line_number("main.cpp", "// breakpoint 1"))
        self.set_breakpoint(line_number("main.cpp", "// breakpoint 2"))

        self.runCmd("process launch", RUN_SUCCEEDED)

        # Note that clang as of r187480 doesn't emit DW_TAG_const_type, unlike gcc 4.8.1
        # With gcc 4.8.1, lldb reports the type as (int &&const)
        self.expect(
            "frame variable i", startstr="(int &&", substrs=["i = 0x", "&i = 3"]
        )

        self.expect("expression -- i", startstr="(int) ", substrs=["3"])

        self.expect("breakpoint delete 1")

        self.runCmd("process continue")

        self.expect("expression -- foo(2)")

        self.expect("expression -- int &&j = 3; foo(j)", error=True)

        self.expect("expression -- int &&k = 6; k", startstr="(int) $1 = 6")

    def set_breakpoint(self, line):
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", line, num_expected_locations=1, loc_exact=True
        )
