"""
Tests that C++ expression evaluation can
disambiguate between rvalue and lvalue
reference-qualified functions.
"""

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


class TestFunctionRefQualifiers(TestBase):
    def test(self):
        self.build()
        lldbutil.run_to_source_breakpoint(
            self, "Break here", lldb.SBFileSpec("main.cpp")
        )

        # const lvalue
        self.expect_expr("const_foo.func()", result_type="uint32_t", result_value="0")

        # const rvalue
        self.expect_expr(
            "static_cast<Foo const&&>(Foo{}).func()",
            result_type="int64_t",
            result_value="1",
        )

        # non-const lvalue
        self.expect_expr("foo.func()", result_type="uint32_t", result_value="2")

        # non-const rvalue
        self.expect_expr("Foo{}.func()", result_type="int64_t", result_value="3")

        self.filecheck("target modules dump ast", __file__)
        # CHECK:      |-CXXMethodDecl {{.*}} func 'uint32_t () const &'
        # CHECK-NEXT: | `-AsmLabelAttr {{.*}}
        # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'int64_t () const &&'
        # CHECK-NEXT: | `-AsmLabelAttr {{.*}}
        # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'uint32_t () &'
        # CHECK-NEXT: | `-AsmLabelAttr {{.*}}
        # CHECK-NEXT: `-CXXMethodDecl {{.*}} func 'int64_t () &&'
        # CHECK-NEXT:   `-AsmLabelAttr {{.*}}
