xref: /llvm-project/lldb/test/API/lang/cpp/function-ref-qualifiers/TestCppFunctionRefQualifiers.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1670cac72SJim Ingham"""
2670cac72SJim InghamTests that C++ expression evaluation can
3670cac72SJim Inghamdisambiguate between rvalue and lvalue
4670cac72SJim Inghamreference-qualified functions.
5670cac72SJim Ingham"""
6670cac72SJim Ingham
7670cac72SJim Inghamimport lldb
8670cac72SJim Inghamfrom lldbsuite.test.decorators import *
9670cac72SJim Inghamfrom lldbsuite.test.lldbtest import *
10670cac72SJim Inghamfrom lldbsuite.test import lldbutil
11670cac72SJim Ingham
12670cac72SJim Ingham
13*2238dcc3SJonas Devlieghereclass TestFunctionRefQualifiers(TestBase):
14670cac72SJim Ingham    def test(self):
15670cac72SJim Ingham        self.build()
16*2238dcc3SJonas Devlieghere        lldbutil.run_to_source_breakpoint(
17*2238dcc3SJonas Devlieghere            self, "Break here", lldb.SBFileSpec("main.cpp")
18*2238dcc3SJonas Devlieghere        )
19670cac72SJim Ingham
20670cac72SJim Ingham        # const lvalue
21670cac72SJim Ingham        self.expect_expr("const_foo.func()", result_type="uint32_t", result_value="0")
22670cac72SJim Ingham
23670cac72SJim Ingham        # const rvalue
24*2238dcc3SJonas Devlieghere        self.expect_expr(
25*2238dcc3SJonas Devlieghere            "static_cast<Foo const&&>(Foo{}).func()",
26*2238dcc3SJonas Devlieghere            result_type="int64_t",
27*2238dcc3SJonas Devlieghere            result_value="1",
28*2238dcc3SJonas Devlieghere        )
29670cac72SJim Ingham
30670cac72SJim Ingham        # non-const lvalue
31670cac72SJim Ingham        self.expect_expr("foo.func()", result_type="uint32_t", result_value="2")
32670cac72SJim Ingham
33670cac72SJim Ingham        # non-const rvalue
34670cac72SJim Ingham        self.expect_expr("Foo{}.func()", result_type="int64_t", result_value="3")
35670cac72SJim Ingham
36670cac72SJim Ingham        self.filecheck("target modules dump ast", __file__)
37670cac72SJim Ingham        # CHECK:      |-CXXMethodDecl {{.*}} func 'uint32_t () const &'
38670cac72SJim Ingham        # CHECK-NEXT: | `-AsmLabelAttr {{.*}}
39670cac72SJim Ingham        # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'int64_t () const &&'
40670cac72SJim Ingham        # CHECK-NEXT: | `-AsmLabelAttr {{.*}}
41670cac72SJim Ingham        # CHECK-NEXT: |-CXXMethodDecl {{.*}} func 'uint32_t () &'
42670cac72SJim Ingham        # CHECK-NEXT: | `-AsmLabelAttr {{.*}}
43670cac72SJim Ingham        # CHECK-NEXT: `-CXXMethodDecl {{.*}} func 'int64_t () &&'
44670cac72SJim Ingham        # CHECK-NEXT:   `-AsmLabelAttr {{.*}}
45